我有一个小的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
的各种排列,但都不能显示菜单。我确信我错过了一些简单的东西--有什么想法吗?
发布于 2012-10-10 18:47:21
在创建图标后尝试添加以下内容:
Application.Run()
请注意,此方法不会返回,因此在调用它之后无法执行任何操作。这意味着你将不得不在一个单独的线程中完成所有其他工作。
发生的情况是,操作系统向您的应用程序发送一条消息,告诉它已经右键单击了托盘图标,但是托盘图标代码永远看不到它(因为这些消息是由Application.Run
处理的),因此无法通过打开菜单来响应。
发布于 2013-03-28 21:23:04
关于Application.Run()
,这是将所有其他代码放在另一个线程中的另一种选择,即在主线程以外的线程上创建NotifyIcon
、menu
、events
等。
这应该包括Application.Run()
,因为这允许标准应用程序消息循环在current线程上工作。然后,因为事件是在同一线程上创建的,所以可以使用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();
}
}
发布于 2013-12-06 04:14:07
以下是解决方案:您必须使用Application.Run()
,因为控制台模式下的gui事件不起作用。但是你可以使用这个解决方案:
var task = System.Threading.Tasks.Task.Factory.StartNew(() => ShowTrayIcon());
void ShowTrayIcon()
{
some code with tray icon ...
}
这将在新线程中启动您的try图标设置...
https://stackoverflow.com/questions/12817468
复制相似问题