C# 将应用程序最小化到系统托盘

C# 将应用程序最小化到系统托盘,c#,windows,winforms,C#,Windows,Winforms,我有一个由C#和Visual Studio 2010支持的Windows窗体应用程序 如何将我的应用程序最小化到系统托盘(而不是任务栏),然后在系统托盘中双击时将其带回来?有什么想法吗?另外,我如何在系统托盘的图标中创建一些菜单,当我右键单击它时,它会显示一个类似于登录、断开连接、连接之类的菜单。 此外,是否有任何方法可以显示为从系统托盘中弹出的阳台 PS:我已经添加了一个notifyIcon,但我不知道如何使用它。 处理窗体的调整大小事件。在这个处理程序中,您重写 调整大小事件的基本功能

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

如何将我的应用程序最小化到系统托盘(而不是任务栏),然后在系统托盘中双击时将其带回来?有什么想法吗?另外,我如何在系统托盘的图标中创建一些菜单,当我右键单击它时,它会显示一个类似于登录、断开连接、连接之类的菜单。 此外,是否有任何方法可以显示为从系统托盘中弹出的阳台

PS:我已经添加了一个notifyIcon,但我不知道如何使用它。

处理窗体的调整大小事件。在这个处理程序中,您重写 调整大小事件的基本功能,使窗体最小化为 系统托盘,而不是任务栏。这可以通过执行 在窗体的调整大小事件处理程序中执行以下操作:检查 窗体的WindowsState属性设置为FormWindowsState.Minimized。如果 是,隐藏表单,启用NotifyIcon对象,然后显示 气球提示,显示一些信息。一旦Windows状态变为 FormWindowsState.Normal,通过设置NotifyIcon对象的 可见属性设置为false。现在,您希望窗口在 双击任务栏中的NotifyIcon对象。为此,, 处理NotifyIcon的MouseDoubleClick事件。在这里,你展示 使用Show()方法创建表单


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

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;
}
另外,可以使用表单设计器设置notify图标控件的以下属性

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]";
我会和你一起去

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;
}
试试这个

 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;
    }

不要忘记将图标文件添加到notifyIcon中,否则它将不会出现在任务栏中。

单击系统任务栏中的图像,您可以验证框架是否可见,然后必须设置visible=true或false

…对于右键单击通知菜单,在表单中添加上下文菜单并编辑它,通过双击每个contextmenuitems设置鼠标单击事件,然后通过在notifyicon中选择ContextMenuStrip将其附加到notifyicon1属性。

这是我在应用程序中使用的方法,它相当简单且不言自明,但我很乐意在回答您的评论时提供更多细节

    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);
    }

this.WindowState=FormWindowState.Minimized

您可以更改Form.FormBorderStyle属性tnx!它起作用了。。还有没有办法禁用右上角的最小化、关闭、最大化按钮?tnxtnx它也起作用了!此外,当我双击系统托盘中的图标时,窗口与其他应用程序不在一起,我必须通过单击任务栏中的窗口来显示它。我们如何处理这件事?tnx太多了,你错过了
this.Show()
before
this.WindowState=FormWindowState.Normal输入“用户不需要任何东西”。)@developerwk,它没有丢失,因为他没有调用
Hide()
。但这种方法的问题是,当您按Alt Tab键时,窗口仍然会出现。我更喜欢调用
Hide()
,这样你根本不必使用
ShowInTaskbar
属性。@Andrew我在使用
Show()
Hide()时遇到问题;隐藏、显示、再隐藏之后,就不会再显示了。@newbiegoy,我想你需要创建一个新问题,因为你的问题不适合对答案进行评论。您将需要提供更多信息,因为您正在使用的代码。您可以包含一个指向您试图使用的答案的链接。在这里,您可以下载一个很好的示例代码,您需要确保进入表单的Designer.cs并“注册”事件处理程序,否则所有这些都无法工作(我无法理解)。可以通过添加这样的内容来实现:this.Resize+=new System.EventHandler(this.ManagementForm\u Resize);此解决方案和其他解决方案都有一个问题:如果表单隐藏在其他窗口下,用户很可能不希望在单击图标时最小化它。相反,它应该集中精力。请参见我的问题:如果您只是从任务栏中隐藏,而不是调用
this.hide()
,则在执行本主题中最需要的部分Alt-Tab时,窗口仍会出现。你能添加更多的信息吗?如何强制它使用默认图标?
    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);
    }