[英]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()
,這是將所有其他代碼放在另一個線程中的替代方法,即在主線程以外的線程上創建NotifyIcon
, menu
, events
等。
這應該包括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.