Private/SysTrayMenu/WriteMenu.ps1

function JsonMenu.SysTrayMenu.WriteMenu {
  <#
    .SYNOPSIS
    .DESCRIPTION
    #>

  param (
    [Parameter()]
    [String]
    $MenuId
  )

  process {
    # Declare assemblies
    [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')    | out-null
    [System.Reflection.Assembly]::LoadWithPartialName('presentationframework')   | out-null
    [System.Reflection.Assembly]::LoadWithPartialName('System.Drawing')    | out-null

    Add-Type -Name Window -Namespace Console -MemberDefinition '
        [DllImport("Kernel32.dll")]
        public static extern IntPtr GetConsoleWindow();
 
        [DllImport("user32.dll")]
        public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);'



    # Force garbage collection just to start slightly lower RAM usage.
    [System.GC]::Collect()

    $appContext = New-Object System.Windows.Forms.ApplicationContext

    $icon = Join-Path -Path $JsonMenu.Info.ModulePath -ChildPath "JsonMenuLogo.ico"
    $sysTrayMenu = New-Object System.Windows.Forms.NotifyIcon
    $sysTrayMenu.Text = $JsonMenu.Context.Menus[$MenuId].Id
    $sysTrayMenu.Icon = $icon
    $sysTrayMenu.Visible = $true

    $menuOptions = $JsonMenu.Context.Menus[$MenuId].Options
    $contextMenuStrip = New-Object System.Windows.Forms.ContextMenuStrip

    # Thie code should be rewritten as it seems that the original does not work anymore
    # Find out how to net ToolstripMenuItem
    # https://www.systanddeploy.com/2020/09/build-powershell-systray-tool-with.html

    # build form in Visual Studio and convert to powershell
    # https://domruggeri.com/2019/07/06/creating-extensive-powershell-gui-applications-part-1/

    # origineel datniet meer werkt
    # https://automateanddeploy.com/index.php/2020/06/24/powershell-system-tray-tool/

    # Solve Write-Host stuff. Seems that it not works because you're in function
    # Maybe execute actions in new window?

    foreach ($option in $menuOptions) {
      switch ( $option.type ) {
        $JsonMenu.Constants.Menu.MenuType {
          $menuItem = New-Object System.Windows.Forms.ToolStripMenuItem
          $menuItem.Text = $option.Value
          $menuOptions = $JsonMenu.Context.Menus[$option.Action].Options
          $menuItem = JsonMenu.SysTrayMenu.WriteOptions -Container $menuItem -Options $menuOptions
          $contextMenuStrip.Items.Add($menuItem)
          break
        }
        $JsonMenu.Constants.Menu.ActionType {
          $menuItem = New-Object System.Windows.Forms.ToolStripMenuItem
          $menuItem.Text = $option.Value
          $menuItem.Name = $option.action
          $menuItem.Add_Click( {
              JsonMenu.SysTrayMenu.InvokeOption -ActionId $args[0].Name
            })
          $contextMenuStrip.Items.Add($menuItem)
          break
        }
        $JsonMenu.Constants.Menu.ExitType {
          $menuItem = New-Object System.Windows.Forms.ToolStripMenuItem
          $menuItem.Text = $option.Value
          $menuItem.Add_Click( {

              [void][System.Windows.Forms.Application]::Exit($null)
            })
          $contextMenuStrip.Items.Add($menuItem)
          break
        }
        Default {}
      }
    }



    # $contextMenuStrip = JsonMenu.SysTrayMenu.WriteOptions -Container $contextMenuStrip -Options $menuOptions

    # $Menu_1 = $contextMenuStrip.Items.Add("Menu 1");
    # $Menu_2 = $contextMenuStrip.Items.Add("Menu 2");
    # $Menu_Restart = $contextMenuStrip.Items.Add("Restart the tool");
    # $Menu_Exit = $contextMenuStrip.Items.Add("Exit");

    # #Sub menus for Menu 1
    # $Menu1_SubMenu1 = New-Object System.Windows.Forms.ToolStripMenuItem
    # $Menu1_SubMenu1.Text = "Menu 1 - Sub menu 1"
    # $Menu_1.DropDownItems.Add($Menu1_SubMenu1)

    # $Menu1_SubMenu2 = New-Object System.Windows.Forms.ToolStripMenuItem
    # $Menu1_SubMenu2.Text = "Menu 1 - Sub menu 2"
    # $Menu_1.DropDownItems.Add($Menu1_SubMenu2)

    # #Sub menus for Menu 2
    # $Menu2_SubMenu1 = New-Object System.Windows.Forms.ToolStripMenuItem
    # $Menu2_SubMenu1.Text = "Menu 2 - Sub menu 1"
    # $Menu_2.DropDownItems.Add($Menu2_SubMenu1)

    # $Menu2_SubMenu2 = New-Object System.Windows.Forms.ToolStripMenuItem
    # $Menu2_SubMenu2.Text = "Menu 2 - Sub menu 2"
    # $Menu_2.DropDownItems.Add($Menu2_SubMenu2)

    $sysTrayMenu.ContextMenuStrip = $contextMenuStrip

    try {
      $JsonMenu.Info.ConsoleIsMinimizable = $true
      $JsonMenu.Info.ConsoleIsMinimizable = JsonMenu.SysTrayMenu.HideConsole
    }
    catch {
      $JsonMenu.Info.ConsoleIsMinimizable = $false
      # $sysTrayMenu.Visible = $false
    }

    [void][System.Windows.Forms.Application]::Run($appContext).WaitForExit()
  }

}