【问题标题】:How to start the application directly in system tray? (.NET C#)如何直接在系统托盘中启动应用程序? (.NET C#)
【发布时间】:2010-12-09 17:18:26
【问题描述】:

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

我想要相同的效果,当用户单击 notifyIcon 的 contextmenustrip 的“显示”按钮时,只有应用程序应该显示 GUI。

我正在使用它,但它不起作用

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

可能我需要在没有 GUI 但具有 notifyIcon 和 ContextMenuStrip 的其他类中具有 Main() 函数,其选项将实例化 GUI 窗口类。对吧?

【问题讨论】:

  • 另请参阅此问题 - stackoverflow.com/questions/807005/…
  • 不好意思扯了个老话题。除了一件重要的事情,我得到了一切。我知道Application.Run() 基本上放弃了控制(?)。我想要做的是让代码在没有用户交互的情况下做一些事情(比如它正在处理数据并将其写入文件)。我应该把这段代码放在哪里,以便它在程序位于系统托盘中时执行?
  • @BarryDysert: Application.Run() 启动 Windows 消息泵。如果您在某处没有此呼叫,那么您的托盘图标将根本不起作用。在不了解您实际想要实现的目标的情况下,我会说查看线程,只需注意修改线程上的 UI 内容的问题,而不是调用 Application.Run() 的线程。

标签: c# .net


【解决方案1】:

您还需要设置通知图标。

手动或通过工具栏(将 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();

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

this question 接受的答案看来,解决方案似乎要改变:

Application.Run(new Form1());

到:

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

Main().

【讨论】:

  • 其实我有 notifyIcon 设置。所以,我只是添加了 this.ShowInTaskbar = false;但问题是窗口会显示一会儿然后隐藏。我不想要这个。
  • 看看我的解决方案,然后爪子。这将解决此问题。
  • @ChrisF: hacks on hacks...这仍然会弹出一个窗口,只是它会开始最小化并且不太可能被注意到。
【解决方案2】:

我通常设置这样的方式是将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您单击显示表单选项。这是可以构建的东西,而不是最终的解决方案。

【讨论】:

  • 进一步说明,您需要使用 GUI 项目,尽管此代码在任何 GUI 弹出之前出现,否则您将弹出控制台窗口,这比原来的更糟糕问题!
  • 太棒了!这正是我正在寻找的。但是如何更改 icon.Icon ?我想把我自己的 *.ico 放在这里。而不是提取一个。
  • new System.Drawing.Icon("C:\Path\To\Icon.ico") 从内存中提取,或使用资源(推荐)。有关如何创建/使用资源的详细信息,请参阅其他问题:stackoverflow.com/questions/90697/…
  • 哇...我已经用 C# 编程将近 10 年了,这是我第一次看到解决这个问题的方法,而不是肮脏的 hack。干得好;)
  • 你将如何定义默认的上下文菜单项(例如,通过简单的图标点击打开表单)?
【解决方案3】:

您是否使用 C# 创建了 Windows 应用程序? 您需要将 NotifyIcon 控件拖到表单上,该控件将放置在表单下方,因为它在表单本身上没有可视化表示。

然后你设置它的属性比如图标...

先试试这个...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多