使用.NET 4,将程序最小化到系统托盘的最简单方法

42

我正在制作一个新的WPF应用程序,需要能够将应用程序最小化并使其漂亮地嵌入到系统托盘中,就在时钟旁边(或者大致在那个区域)。

这必须在Windows XP、Vista和7上运行。 我不需要支持旧版本的Windows。

如果我使用.NET 4,最简单的方法是什么?

3个回答

80

MSDN论坛中的示例

下面是一个快速示例,展示了如何将窗口最小化到通知区域。您需要添加对 System.Window.FormsSystem.Drawing程序集的引用。

public partial class Window1 : System.Windows.Window
{

    public Window1()
    {
        InitializeComponent();

        System.Windows.Forms.NotifyIcon ni = new System.Windows.Forms.NotifyIcon();
        ni.Icon = new System.Drawing.Icon("Main.ico");
        ni.Visible = true;
        ni.DoubleClick += 
            delegate(object sender, EventArgs args)
            {
                this.Show();
                this.WindowState = WindowState.Normal;
            };
    }

    protected override void OnStateChanged(EventArgs e)
    {
        if (WindowState == System.Windows.WindowState.Minimized)
            this.Hide();

        base.OnStateChanged(e);
    }
}

1
那么我必须在我的应用程序目录中有一个名为“Main.ico”的图标吗? - Felix D.
1
LeGrandMere - 感谢您出色而简洁的修复。Felix D:您可以使用以下代码添加图标:var iconStream = Application.GetResourceStream(new Uri("pack://application:,,,/LaunchPad.UI;component/Images/Launch.ico"))?.Stream;然后执行以下操作var ni = new NotifyIcon{Icon = new Icon(iconStream),Visible = true}; - yonsk
将图标添加到您的解决方案中,然后打开项目属性并更改后期生成事件,如下所示:copy /Y "$(SolutionDir)Utility\Main.ico" "$(SolutionDir)Utility\bin\Debug\Main.ico" - Barış Akkurt
我曾经在访问图标文件时遇到了困难。我的解决方案是:将文件添加到应用程序目录中。在解决方案资源管理器中,将构建设置更改为“嵌入式资源”。然后可以通过以下方式访问图标:Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("YOUR_NAMESPACE.ICON_FILENAME")),并像答案中那样设置在通知图标上 ni.Icon = new System.Drawing.Icon(stream); - Matthias Tylkowski
运行良好。截至2020年,在VS 2019 16.7.3中,存在base.OnStateChanged(e)会导致堆栈溢出。 - Emil Mocan
另外,不要忘记在窗口关闭后处理通知图标。最好将其设置为成员变量。 - Emil Mocan

18

我在WPF中使用过这个免费的notify-icon实现,并取得了成功。

http://www.hardcodet.net/projects/wpf-notifyicon

这个实现很容易设置,而且提供了源代码。它不依赖于Windows Forms,因此是'纯' WPF,非常可定制。

您可以在CodeProject上找到有关如何使用它的教程。
这里是Nuget包


1
你能展示一些代码样例吗? - Damian Ubowski

0
从工具箱中添加notifyIcon到你的应用程序。
选择你的主form >> 进入属性 >> 选择事件图标 >> 在FromClosing event下输入MainForm_FormClosing >> 按Enter键。

enter image description here

在打开的 .cs 文件中输入以下事件操作:
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
     this.Hide();
     notifyIcon.Visible = true;
     ShowInTaskbar = false;
     e.Cancel = true;
}

现在,当您单击X按钮时,您的主FORM窗口将最小化到系统托盘。下一步是将FORM恢复到正常状态。
进入notifyIcon属性 >> 找到DoubleClick事件 >> 输入NotifyIcon_DoubleClick并按Enter键以为您创建事件函数。

enter image description here

将此代码放入您的事件中:
private void NotifyIcon_DoubleClick(object sender, EventArgs e)
{
    this.Show();
    notifyIcon.Visible = false;
}

现在,如果你想让通知图标看起来更加漂亮,你可以添加上下文菜单并将其链接到你的通知图标,这样你就可以得到类似于这样的效果:

enter image description here

这里是将 contextMenuStrip 链接到 NotifyIcon 的位置:

enter image description here

祝你好运!


18
我认为你描述的是Windows Forms而不是WPF。 - TN.
问题是关于WPF而不是WINFORM。 - Amir Astaneh

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