【问题标题】:minimize app to system tray将应用程序最小化到系统托盘
【发布时间】:2011-11-29 08:07:35
【问题描述】:

我有一个由 C# 和 Visual Studio 2010 提供支持的 Windows 窗体应用程序。

如何将我的应用程序最小化到系统托盘(不是任务栏),然后在系统托盘中双击时将其恢复?任何想法?另外,如何在系统托盘的图标中创建一些菜单,当我右键单击它时,它会显示一个菜单,如登录、断开连接、连接等。 另外,有没有办法让系统托盘弹出气球一样的样子?

PS:我已经加了一个notifyIcon,但是不知道怎么用。

【问题讨论】:

  • 在这里你可以下载一个很棒的示例代码simple-talk.com/dotnet/.net-framework/…
  • 您需要确保进入表单的 Designer.cs 并“注册”事件处理程序,否则这些都不起作用(我想不通)。您可以通过添加如下内容来做到这一点: this.Resize += new System.EventHandler(this.ManagementForm_Resize);

标签: c# windows winforms


【解决方案1】:

处理表单的 Resize 事件。在此处理程序中,您覆盖 Resize 事件的基本功能,使表单最小化为 系统托盘而不是任务栏。这可以通过执行 在表单的 Resize 事件处理程序中执行以下操作:检查是否 窗体的 WindowState 属性设置为 FormWindowState.Minimized。如果 是的,隐藏您的表单,启用 NotifyIcon 对象,然后显示 显示一些信息的气球提示。一旦 WindowState 变为 FormWindowState.Normal,通过设置 NotifyIcon 对象来禁用它 可见属性为假。现在,您希望窗口在 您双击任务栏中的 NotifyIcon 对象。为了这, 处理 NotifyIcon 的 MouseDoubleClick 事件。在这里,您展示了 使用 Show() 方法形成表单。

private void frmMain_Resize(object sender, EventArgs e)
{
    if (FormWindowState.Minimized == this.WindowState)
    {
       mynotifyicon.Visible = true;
       mynotifyicon.ShowBalloonTip(500);
       this.Hide();
    }

    else if (FormWindowState.Normal == this.WindowState)
    {
       mynotifyicon.Visible = false;
    }
}

【讨论】:

【解决方案2】:

我发现这可以完成整个解决方案。上面的答案无法从任务栏中删除窗口。

private void ImportStatusForm_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        notifyIcon.Visible = true;
        notifyIcon.ShowBalloonTip(3000);
        this.ShowInTaskbar = false;
    }
}

private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = true;
    notifyIcon.Visible = false;
}

另外,最好使用表单设计器设置通知图标控件的以下属性。

this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't think there is an error.
this.notifyIcon.BalloonTipText = "[Balloon Text when Minimized]";
this.notifyIcon.BalloonTipTitle = "[Balloon Title when Minimized]";
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); //The tray icon to use
this.notifyIcon.Text = "[Message shown when hovering over tray icon]";

【讨论】:

  • 你在this.WindowState = FormWindowState.Normal;之前缺少this.Show();
  • “用户不喜欢”中的错字。 ;)
  • @developerwjk,它没有丢失,因为他没有打电话给Hide()。但是这种方法的问题是当你按下 Alt-Tab 时窗口仍然出现。我更喜欢调用Hide(),这样你就不必使用ShowInTaskbar 属性了。
  • @Andrew 我在使用Show()Hide() 时遇到问题;隐藏,显示,然后隐藏后,它不会再次显示。
  • @newbieguy,我想您需要创建一个新问题,因为您的问题不适合对答案发表评论。您将需要提供更多信息,作为您使用的代码。您可以包含指向您尝试使用的答案的链接。
【解决方案3】:

不要忘记将图标文件添加到您的 notifyIcon 中,否则它将不会出现在托盘中。

【讨论】:

  • 主题中最需要的部分。您能否添加更多信息,如何强制它使用默认图标?
【解决方案4】:

我会去的

private void Form1_Resize(object sender, EventArgs e)
{
     if (FormWindowState.Minimized == this.WindowState)
     {
          notifyIcon1.Visible = true;
          notifyIcon1.ShowBalloonTip(500);
          this.Hide();    
     }
     else if (FormWindowState.Normal == this.WindowState)
     {
          notifyIcon1.Visible = false;
     }
}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
     this.Show();
     this.WindowState = FormWindowState.Normal;
}

【讨论】:

    【解决方案5】:

    试试这个

     private void Form1_Load(object sender, EventArgs e)
        {
            notifyIcon1.BalloonTipText = "Application Minimized.";
            notifyIcon1.BalloonTipTitle = "test";
        }
    
        private void Form1_Resize(object sender, EventArgs e)
        {
            if (WindowState == FormWindowState.Minimized)
            {
                ShowInTaskbar = false;
                notifyIcon1.Visible = true;
                notifyIcon1.ShowBalloonTip(1000);
            }
        }
    
        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            ShowInTaskbar = true;
            notifyIcon1.Visible = false;
            WindowState = FormWindowState.Normal;
        }
    

    【讨论】:

    • 如果您只是从任务栏隐藏而不是调用this.Hide(),则在执行 Alt-Tab 时仍会出现该窗口。
    【解决方案6】:

    这是我在我的应用程序中使用的方法,它相当简单且不言自明,但我很乐意为您的 cmets 提供更多详细信息。

        public Form1()
        {
            InitializeComponent();
    
            // When window state changed, trigger state update.
            this.Resize += SetMinimizeState;
    
            // When tray icon clicked, trigger window state change.       
            systemTrayIcon.Click += ToggleMinimizeState;
        }      
    
        // Toggle state between Normal and Minimized.
        private void ToggleMinimizeState(object sender, EventArgs e)
        {    
            bool isMinimized = this.WindowState == FormWindowState.Minimized;
            this.WindowState = (isMinimized) ? FormWindowState.Normal : FormWindowState.Minimized;
        }
    
        // Show/Hide window and tray icon to match window state.
        private void SetMinimizeState(object sender, EventArgs e)
        {    
            bool isMinimized = this.WindowState == FormWindowState.Minimized;
    
            this.ShowInTaskbar = !isMinimized;           
            systemTrayIcon.Visible = isMinimized;
            if (isMinimized) systemTrayIcon.ShowBalloonTip(500, "Application", "Application minimized to tray.", ToolTipIcon.Info);
        }
    

    【讨论】:

    • 这个和其他解决方案有一个问题:如果表单隐藏在其他窗口下,用户很可能不想在单击图标时将其最小化。相反,它应该集中。在这里查看我的问题:stackoverflow.com/questions/36797442/…
    【解决方案7】:

    点击系统托盘中的图片,可以验证框架是否可见,然后设置Visible = true or false

    【讨论】:

      【解决方案8】:

      ...为您的右键单击通知菜单添加一个上下文菜单到表单并对其进行编辑并通过双击它们为每个上下文菜单项设置鼠标单击事件,然后通过在 notifyicon 属性中选择 ContextMenuStrip 将其附加到 notifyicon1。

      【讨论】:

        【解决方案9】:

        this.WindowState = FormWindowState.Minimized;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-20
          • 1970-01-01
          • 2015-01-31
          • 1970-01-01
          相关资源
          最近更新 更多