如何启动WinForm应用程序最小化到托盘?

我已经成功地创build了一个应用程序,使用NotifyIcon最小化托盘。 当表单被手动closures时,它成功地从桌面,任务栏和alt-tab隐藏。 尝试开始使应用程序最小化时发生问题。 起初问题是应用程序将被最小化,但仍然会出现在alt-tab对话框中。 将FormBorderStyle更改为其中一个ToolWindow选项(来自“None”选项)解决了这个问题,但引入了另一个问题。 当应用程序第一次启动时,最小化窗口的标题栏在开始菜单上方可见:

图片http://i38.tinypic.com/2wny811.gif 。

打开表格,并closures它导致它正确隐藏。 我已经尝试了很多变化,但是现在基本上它是如何工作的…

WindowState在devise器中设置为最小化。 在构造函数中进行一些初始化之后,我有以下几行:

this.Visible = false; this.ShowInTaskbar = false; 

当双击NotifyIcon时,我有以下几点:

  this.WindowState = FormWindowState.Normal; this.Visible = true; this.ShowInTaskbar = true; 

就像我说的,我已经尝试了很多小的变化(this.Hide()等)。 有没有办法让NotifyIcon成为主要组件,使我可以完全启动和处置表单,而使NotifyIcon运行? 有一种方式来启动应用程序的forms最小化没有任何古怪的。 请帮我find它!

正确的做法是首先防止窗体变得可见。 这需要重写SetVisibleCore()。 让我们假设一个显示和退出命令的NotifyIcon的上下文菜单。 你可以像这样实现它:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); notifyIcon1.ContextMenuStrip = contextMenuStrip1; this.showToolStripMenuItem.Click += showToolStripMenuItem_Click; this.exitToolStripMenuItem.Click += exitToolStripMenuItem_Click; } private bool allowVisible; // ContextMenu's Show command used private bool allowClose; // ContextMenu's Exit command used protected override void SetVisibleCore(bool value) { if (!allowVisible) { value = false; if (!this.IsHandleCreated) CreateHandle(); } base.SetVisibleCore(value); } protected override void OnFormClosing(FormClosingEventArgs e) { if (!allowClose) { this.Hide(); e.Cancel = true; } base.OnFormClosing(e); } private void showToolStripMenuItem_Click(object sender, EventArgs e) { allowVisible = true; Show(); } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { allowClose = true; Application.Exit(); } } 

注意Load事件有一个皱折,直到首先显示主窗体才会触发。 所以一定要在窗体的构造函数中进行初始化,而不是Load事件处理函数。

构造函数中 ,删除这两行:

 this.Visible = false; this.ShowInTaskbar = false; 

并在InitializeComponent();后添加InitializeComponent();

 this.WindowState = FormWindowState.Minimized; 

在devise器中,将ShowInTaskbar设置为false ,将FormWindowStateNormal

编辑:如果您发布相同的Load事件,窗口确实最小化,但仍然显示在桌面上最小化。 我认为这是一个错误。

我正在阅读所有的答案,看黑客和黑魔法…(没有进攻,队友)

伙计们,不需要黑客。 你甚至不需要设置“ShowInTaskbar = false”等东西。 只要这样做:

  //"Form Shown" event handler private void Form_Shown(object sender, EventArgs e) { //to minimize window this.WindowState = FormWindowState.Minimized; //to hide from taskbar this.Hide(); } 

注意:我强烈build议不要触摸“ShowInTaskbar”属性。 例如,如果您的应用程序注册系统范围的热键或其他类似的东西(挂钩等) – 设置ShowInTaskBar = false,并最大限度地减less您的应用程序将阻止Windows发送一些消息到您的窗口…而你的钩子/热键/等停止工作。

当最小化一个应用程序,你想从Alt + Tab中隐藏它:

当您将“边框样式”设置为“工具”窗口时,还需要设置“不透明度”以停止在“开始”菜单附近显示的标题栏。

最小化事件:

 this.Visible = false; this.Opacity = 0; this.FormBorderStyle = FormBorderStyle.FixedToolWindow; this.ShowInTaskbar = false; 

正常化事件:

 this.Visible = true; this.Opacity = 100; this.FormBorderStyle = FormBorderStyle.FixedSingle; //or whatever it was previously set to this.ShowInTaskbar = true; 

这个“快速和肮脏的修复”为我工作:

 $form1.FormBorderStyle = "fixedtoolwindow" $form1.top = -1000000 $form1.Left = -1000000 $form1.Width = 10 $form1.Height = 10 $form1.WindowState = "normal" $form1.ShowInTaskbar = $False $form1.Opacity = 0 $form1.Hide() 

希望它可以帮助别人…