首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >c#控制台应用程序的系统托盘图标不显示菜单

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

Stack Overflow用户
提问于 2012-10-10 18:43:03
回答 4查看 21.1K关注 0票数 9

我有一个小的C# (.NET 4.0)控制台应用程序,我希望用户在右键单击系统托盘图标时能够通过显示菜单来进行交互。我可以将图标添加到托盘,没有任何问题,但我就是无法显示菜单。我使用了以下代码:

代码语言:javascript
代码运行次数: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的各种排列,但都不能显示菜单。我确信我错过了一些简单的东西--有什么想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-10 18:47:21

在创建图标后尝试添加以下内容:

代码语言:javascript
代码运行次数:0
运行
复制
Application.Run()

请注意,此方法不会返回,因此在调用它之后无法执行任何操作。这意味着你将不得不在一个单独的线程中完成所有其他工作。

发生的情况是,操作系统向您的应用程序发送一条消息,告诉它已经右键单击了托盘图标,但是托盘图标代码永远看不到它(因为这些消息是由Application.Run处理的),因此无法通过打开菜单来响应。

票数 18
EN

Stack Overflow用户

发布于 2013-03-28 21:23:04

关于Application.Run(),这是将所有其他代码放在另一个线程中的另一种选择,即在主线程以外的线程上创建NotifyIconmenuevents等。

这应该包括Application.Run(),因为这允许标准应用程序消息循环在current线程上工作。然后,因为事件是在同一线程上创建的,所以可以使用Application.Exit()来关闭通知消息传递,但仍然允许主线程继续。下面是一个控制台应用程序的小示例。

代码语言:javascript
代码运行次数:0
运行
复制
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();
    }

}
票数 9
EN

Stack Overflow用户

发布于 2013-12-06 04:14:07

以下是解决方案:您必须使用Application.Run(),因为控制台模式下的gui事件不起作用。但是你可以使用这个解决方案:

代码语言:javascript
代码运行次数:0
运行
复制
var task = System.Threading.Tasks.Task.Factory.StartNew(() => ShowTrayIcon());

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

这将在新线程中启动您的try图标设置...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12817468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档