带有c#控制台应用程序的系统托盘图标将不显示菜单

我有一个小的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,菜单,事件等。 这应该包括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事件无法正常工作。 但是你可以使用这个解决方案:

 System.Threading.Tasks.Task 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; } 

试试这个。 认为这会对你有所帮助。