簡體   English   中英

帶有c#控制台應用程序的系統托盤圖標將不顯示菜單

[英]System tray icon with c# Console Application won't show menu

我有一個小的C#(.NET 4.0)控制台應用程序,我希望用戶能夠通過右鍵單擊系統托盤圖標時顯示菜單來進行交互。 我可以在沒有任何問題的情況下為托盤添加圖標,但我無法顯示菜單。 我正在使用以下代碼:

NotifyIcon trayIcon = new NotifyIcon();
trayIcon.Text = "TestApp";
trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40);

ContextMenu trayMenu = new ContextMenu();

trayMenu.MenuItems.Add("Blah", item1_Click);
trayMenu.MenuItems.Add("Blah2", item1_Click);
trayMenu.MenuItems.Add("Blah3", item1_Click);

trayIcon.ContextMenu = trayMenu;
trayIcon.Visible = true;

...將圖標放入托盤中。 但是,右鍵單擊該圖標不會執行任何操作。 我嘗試過MenuItems.Add各種排列,但沒有任何東西可以顯示菜單。 我確定我錯過了一些簡單的東西 - 任何想法是什么?

創建圖標后嘗試添加此項:

Application.Run()

請注意,此方法不會返回,因此在調用之后您無法執行任何操作。 這意味着您必須在單獨的線程中完成所有其他工作。

操作系統會向您的應用程序發送一條消息,告知它已右鍵單擊托盤圖標,但托盤圖標代碼從未看到它(因為這些消息由Application.Run處理)因此無法通過打開來響應菜單。

關於Application.Run() ,這是將所有其他代碼放在另一個線程中的替代方法,即在主線程以外的線程上創建NotifyIconmenuevents等。

這應該包括Application.Run()因為這允許標准應用程序消息循環在當前線程上工作。 然后,由於事件是在同一個線程上創建的,因此Application.Exit()可用於關閉通知消息,但仍允許主線程繼續。 這是一個控制台應用程序的小例子......

class Program 
{
    public static ContextMenu menu;
    public static MenuItem mnuExit;
    public static NotifyIcon notificationIcon;

    static void Main(string[] args)
    {
        Thread notifyThread = new Thread(
            delegate()
            {
                menu = new ContextMenu();
                mnuExit = new MenuItem("Exit");
                menu.MenuItems.Add(0, mnuExit);

                notificationIcon = new NotifyIcon()
                {
                    Icon = Properties.Resources.Services,
                    ContextMenu = menu,
                    Text = "Main"
                };
                mnuExit.Click += new EventHandler(mnuExit_Click);

                notificationIcon.Visible = true;
                Application.Run();
            }
        );

        notifyThread.Start();

        Console.ReadLine();          
    }

    static void mnuExit_Click(object sender, EventArgs e)
    {
        notificationIcon.Dispose();
        Application.Exit();
    }

}

這是解決方案:您必須使用Application.Run()因為控制台模式下的gui事件無法正常工作。 但是你可以使用這個解決方案:

var task = System.Threading.Tasks.Task.Factory.StartNew(() => ShowTrayIcon());

void ShowTrayIcon()
{
    some code with tray icon ...
}

這將開始在新線程中設置try圖標...

您是否為托盤圖標鼠標單擊添加了事件處理程序?

trayIcon .MouseDown += new MouseEventHandler(trayIcon_MouseDown);

創建上下文菜單,並在trayIcon_MouseDown函數內執行以下操作

private void trayIcon_MouseDown (object sender,MouseEventArgs e)
{
  //add you menu items to context menu
  contextMenu.Items.Add(item);
  contextMenu.IsOpen = true;  
}

嘗試這個。 認為這會對你有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM