如何在系统托盘中启动应用程序?(.NET C#)

11

我的意思是当用户启动我的应用程序(exe)时,我希望它直接在系统托盘中启动,而不显示窗口。就像杀毒软件和下载管理器一样,在系统托盘中静默启动和运行。

我想要同样的效果,只有当用户单击notifyIcon的contextmenustrip的"show"按钮时,应用程序才会显示GUI。

我正在使用这个,但它没有起作用。

    private void Form_Load(object sender, EventArgs e)
    {
        this.Hide();
    }

也许我需要在另一个没有GUI但具有notifyIcon和ContextMenuStrip的类中拥有Main()函数,其选项将实例化GUI窗口类。对吧?


请参阅此问题 - https://dev59.com/i3RA5IYBdhLWcg3w1BqW - ChrisF
抱歉挖掘一个旧话题。除了一个重要的事情外,我已经掌握了一切。我理解 Application.Run() 本质上是放弃控制 (?). 我想做的是让代码在没有用户交互的情况下执行某些操作(比如处理数据并将其写入文件)。我应该把这段代码放在哪里,以便在程序停留在系统托盘时执行? - Barry Dysert
@BarryDysert: Application.Run() 启动了 Windows 消息泵。如果你没有在某个地方调用它,那么你的托盘图标将完全无法工作。不知道你实际想要实现什么,我建议你看看线程,但要注意在除了从 Application.Run() 调用的线程之外的其他线程上修改 UI 的问题。 - Matthew Scharley
3个回答

32

我通常设置类似于这样的东西,是通过修改 Program.cs 文件,使其看起来像下面这样:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        using (NotifyIcon icon = new NotifyIcon())
        {
            icon.Icon = System.Drawing.Icon.ExtractAssociatedIcon(Application.ExecutablePath);
            icon.ContextMenu = new ContextMenu(new MenuItem[] {
                new MenuItem("Show form", (s, e) => {new Form1().Show();}),
                new MenuItem("Exit", (s, e) => { Application.Exit(); }),
            });
            icon.Visible = true;

            Application.Run();
            icon.Visible = false;
        }
    }

使用这种方法,您无需担心隐藏表单而非关闭表单以及其他可能导致的繁琐操作...您也可以创建一个单例表单,而不是每次点击显示表单选项时实例化新的Form。 这是建立在此基础之上的一些内容,而不是最终解决方案。


1
作为进一步的说明,您需要使用GUI项目,尽管此代码出现在任何GUI弹出之前,否则您将会看到一个控制台窗口弹出,这比原来的问题更糟糕! - Matthew Scharley
1
从内存中创建 new System.Drawing.Icon("C:\Path\To\Icon.ico"),或者使用资源(推荐)。有关如何创建和使用资源的详细信息,请参见此其他问题:https://dev59.com/rnVD5IYBdhLWcg3wGHiu。 - Matthew Scharley
1
哇... 我已经使用C#编程将近10年了,而这是我第一次看到解决那个问题的方法不是一个“脏”技巧。干得好 ;) - Thomas Levesque
你会如何定义默认的上下文菜单项(例如,在简单图标单击时打开表单)? - Bitterblue
@mini-me:虽然已经很晚了,但我相信所有类型的点击(左键、双击等)都是通过NotifyIcon上的事件处理的。只需挂钩相关事件并以这种方式打开您的表单即可。 - Matthew Scharley
显示剩余6条评论

3

您需要设置通知图标。

通过工具栏(将notifyIcon拖到窗体上)或手动方式创建notifyIcon:

this.notifyIcon = new System.Windows.Forms.NotifyIcon(components);

然后将这段代码添加到 Form_Load() 中:

// Notify icon set up
notifyIcon.Visible = true;
notifyIcon.Text = "Tooltip message here";
this.ShowInTaskbar = false;
this.Hide();

虽然正如已经指出的那样,这将在隐藏之前简要显示表单。

这个问题的被接受回答中可以看出,解决方案似乎是改变:

Application.Run(new Form1());

to:

Form1 f = new Form1();
Application.Run();        

Main()函数中。


实际上我已经设置了 notifyIcon。所以,我只是添加了this.ShowInTaskbar = false;但问题是窗口会短暂出现然后立即隐藏。我不希望这种情况发生。 - claws
请查看我的解决方案,然后进行修改。这将解决此问题。 - Matthew Scharley
@ChrisF:不断地进行黑客攻击...这仍然会弹出一个窗口,只是它会开始最小化,并且不太可能被注意到。 - Matthew Scharley

0
你是否在C#中创建了一个Windows应用程序? 你需要将NotifyIcon控件拖到窗体上,该控件将放置在窗体下方,因为它在窗体本身上没有可视化表示。
然后,您可以设置其属性,例如图标...
首先尝试这个...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接