【问题标题】:Easiest way to have a program minimize itself to the system tray using .NET 4使用 .NET 4 将程序最小化到系统托盘的最简单方法
【发布时间】:2012-05-01 02:46:01
【问题描述】:

我正在制作一个新的 WPF 应用程序,我需要能够最小化该应用程序并在时钟旁边(或该一般区域)的系统托盘中保持美观和舒适。

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

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

【问题讨论】:

    标签: c# wpf .net-4.0 system-tray minimize


    【解决方案1】:

    我已经成功地在 WPF 中使用了这个免费的通知图标实现。

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

    设置非常简单,并且提供了源代码。它不依赖于 Windows 窗体,因此它是“纯”WPF 并且非常可定制。

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

    【讨论】:

    • 能否展示一些代码示例?
    【解决方案2】:

    Example in MSDN forum

    这里有一个简单的例子来展示如何最小化通知区域。您需要添加对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);
        }
    }
    

    【讨论】:

    • 所以我的 ApplicationDirectory 中必须有一个名为“Main.ico”的图标?
    • 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 };
    • 将图标添加到您的解决方案,然后打开项目的属性并更改构建后事件,如下所示: copy /Y "$(SolutionDir)Utility\Main.ico" "$(SolutionDir)Utility\bin\调试\Main.ico"
    • 我很难访问图标文件。我现在的解决方案是:将文件添加到应用程序目录中。在解决方案资源管理器中将构建设置更改为embedded resource。然后可以通过以下方式访问该图标:Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("YOUR_NAMESPACE.ICON_FILENAME")) 并在 NotificationIcon 上设置,如答案ni.Icon = new System.Drawing.Icon(stream);
    • 效果很好。截至 2020 年 VS 2019 16.7.3,base.OnStateChanged(e) 的存在会导致堆栈溢出。
    【解决方案3】:

    从工具箱将notifyIcon 添加到您的应用程序中。
    选择您的主要form >> 转到Properties >> 选择Events 图标>> 在FromClosing event 下输入MainForm_FormClosing >> 回车。

    在打开的.cs 文件中输入以下事件操作:

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
         this.Hide();
         notifyIcon.Visible = true;
         ShowInTaskbar = false;
         e.Cancel = true;
    }
    

    现在,当您单击 X 按钮时,您的主 FORM 窗口将最小化到系统托盘。下一步是让 FORM 恢复正常状态。
    转到您的notifyIconProperties >> 找到DoubleClick event >> 输入NotifyIcon_DoubleClick 并回车以获取为您创建的事件函数。

    将此代码放入您的活动中:

    private void NotifyIcon_DoubleClick(object sender, EventArgs e)
    {
        this.Show();
        notifyIcon.Visible = false;
    }
    

    现在,如果您想制作花哨风格的通知图标,您可以添加上下文菜单并将其链接到您的通知图标,这样您就会得到类似的东西:

    这里是将 contextMenuStrip 链接到 NotifyIcon 的地方:

    祝你好运!

    【讨论】:

    • 在我看来,您描述的是 Windows 窗体而不是 WPF。
    • 问题是关于 WPF 而不是 WINFORM
    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多