将 WinForms 应用程序最小化到系统托盘的正确方法是什么?

笔记:最小化到 系统托盘;在任务栏右侧的时钟旁边。我不是在问最小化到任务栏,这就是当您点击窗口上的“减号”按钮时发生的情况。

我见过一些黑客解决方案,例如“最小化,设置 ShowInTaskbar = false,然后显示您的 NotifyIcon。”

类似的解决方案是很黑客的,因为该应用程序似乎不像其他应用程序那样最小化到托盘,代码必须检测何时设置 ShowInTaskbar = true 等问题。

执行此操作的正确方法是什么?

有帮助吗?

解决方案

实际上没有托管方法可以在本机 winform 中对托盘执行这种形式的动画,但是您可以 P/Invoke shell32.dll 来执行此操作:

这里有一些很好的信息(在评论中而不是帖子中):

http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx

这是 C++ 语言:

http://www.codeproject.com/KB/shell/minimizetotray.aspx

您可以使用它来找出适合您的 C# 版本的 Pinvoke 内容。

其他提示

this.WindowState = FormWindowState.Minimized  

这是内置的方法,在我看来大多数时候都很好。唯一的情况是,如果你在启动时调用它,有时会有些奇怪,这就是为什么大多数人也会设置 ShowInTaskbar = false 并隐藏表单。

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowstate.aspx

它将帮助:

public partial class Form1 : Form
{
    public static bool Close = false;
    Icon[] images;
    int offset = 0;

    public Form1()
    {
        InitializeComponent();

        notifyIcon1.BalloonTipText = "My application still working...";
        notifyIcon1.BalloonTipTitle = "My Sample Application";
        notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; 
    }

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

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

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

    private void closeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Close = true;
        this.Close();  
    }

    // Handle Closing of the Form.
    protected override void OnClosing(CancelEventArgs e)
    {
        if (Close)
        {
            e.Cancel = false;
        }
        else
        {
            WindowState = FormWindowState.Minimized;
            e.Cancel = true;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Load the basic set of eight icons.
        images = new Icon[5];
        images[0] = new Icon("C:\\icon1.ico");
        images[1] = new Icon("C:\\icon2.ico");
        images[2] = new Icon("C:\\icon3.ico");
        images[3] = new Icon("C:\\icon4.ico");
        images[4] = new Icon("C:\\icon5.ico");
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        // Change the icon.
        // This event handler fires once every second (1000 ms).
        if (offset < 5)
        {
            notifyIcon1.Icon = images[offset];
            offset++;
        }
        else
        {
            offset = 0;
        }
    }
}

此代码经过测试并支持许多选项。

更多这里: http://code.msdn.microsoft.com/TheNotifyIconExample

更新:看来我发帖太早了。我还使用了下面的 hack 作为我的工具。等待合适的解决方案............

您可以使用 Windows.Forms.NotifyIcon 来实现此目的。 http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

将 NotifyIcon 添加到表单中,设置一些属性,然后就完成了。

        this.ShowIcon = false;//for the main form
        this.ShowInTaskbar = false;//for the main form
        this.notifyIcon1.Visible = true;//for notify icon
        this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));//set an icon for notifyicon

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

与上面类似...

我有一个调整大小事件处理程序,每当调整窗口大小(最大化、最小化等)时都会触发该事件处理程序...

    public form1()
    {
       Initialize Component();

       this.Resize += new EventHanlder(form1_Resize);
    } 


    private void form1_Resize(object sender, EventArgs e)
    {
       if (this.WindowState == FormWindowState.Minimized && minimizeToTrayToolStripMenuItem.Checked == true)
       {
             NotificationIcon1.Visible = true;
             NotificationIcon1.BalloonTipText = "Tool Tip Text"
             NotificationIcon1.ShowBalloonTip(2);  //show balloon tip for 2 seconds
             NotificationIcon1.Text = "Balloon Text that shows when minimized to tray for 2 seconds";
             this.WindowState = FormWindowState.Minimized;
             this.ShowInTaskbar = false;
       }
    }

这允许用户选择是否要通过菜单栏最小化到托盘。他们可以转到 Windows -> 并单击“最小化到托盘”。如果检查了这一点,并且正在调整窗口以最小化,则将其最小化。对我来说完美无缺。

在表单的构造函数中:

this.Resize += new EventHandler(MainForm_Minimize);

然后使用这个事件处理程序方法:

    private void MainForm_Minimize(object sender, EventArgs e)
    {
        if(this.WindowState == FormWindowState.Minimized)
            Hide();
    }

如果您在使用此功能时遇到问题,请检查您是否有

this.Resize += new System.EventHandler(this.Form1_Resize);

在fom1.designer.cs中

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top