最小化托盘C#WinForms应用程序的正确方法是什么?

时间:2020-03-05 18:48:32  来源:igfitidea点击:

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

注意:最小化到系统托盘;在任务栏右侧按时钟排列。我并不是在问最小化任务栏,这是当我们单击窗口上的"减号"按钮时发生的事情。

我见过一些棘手的解决方案,例如"最小化,将ShowInTaskbar = false设置,然后显示NotifyIcon"。

像这样的解决方案是骇人听闻的,因为该应用程序似乎没有像其他应用程序那样最小化,因此代码必须检测何时将ShowInTaskbar = true设置为其他问题。

这样做的正确方法是什么?

解决方案

回答

this.WindowState = FormWindowState.Minimized

这是一种内置的方式,大多数时候对我来说看起来不错。唯一的时间是有些奇怪,如果我们在启动时调用它有时会有些奇怪,这就是为什么大多数人也会设置ShowInTaskbar = false并隐藏表单的原因。

http://msdn.microsoft.com/zh-CN/library/system.windows.forms.form.windowstate.aspx

回答

更新:看起来我发布得太早了。
我还使用下面的技巧作为我的工具。等待正确的解决方案……....

我们可以为此使用Windows.Forms.NotifyIcon。 http://msdn.microsoft.com/zh-CN/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();
    }

回答

实际上,没有任何托管方法可以在本机winforms中将这种形式的动画制作到托盘上,但是我们可以P / Invoke shell32.dll来做到这一点:

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

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

这是在C ++中:

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

我们可以使用它来为Cversion找出哪些内容需要Pinvoke。

回答

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

此处更多信息:http://code.msdn.microsoft.com/TheNotifyIconExample

回答

在窗体的构造函数中:

this.Resize += new EventHandler(MainForm_Minimize);

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

private void MainForm_Minimize(object sender, EventArgs e)
    {
        if(this.WindowState == FormWindowState.Minimized)
            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 System.EventHandler(this.Form1_Resize);

在fom1.designer.cs中

回答

这会有所帮助,

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

    }