我只想要一个带有隐藏主窗口的ac#应用程序,它将处理并响应窗口消息.
我可以创建一个表单而不显示它,然后可以调用Application.Run()而不传入表单,但是如何将创建的表单挂钩到消息循环中?
还有另一种方法可以解决这个问题吗?
提前感谢任何提示!
优秀!那个链接指向了我正确的方向.这似乎有效:
Form f = new Form1(); f.FormBorderStyle = FormBorderStyle.FixedToolWindow; f.ShowInTaskbar = false; f.StartPosition = FormStartPosition.Manual; f.Location = new System.Drawing.Point(-2000, -2000); f.Size = new System.Drawing.Size(1, 1); Application.Run(f);
为了防止它显示在Alt-Tab中,您需要它作为工具窗口.不幸的是,这可以防止它最小化.但是将起始位置设置为手动并将其定位在屏幕外就可以了!
在重写VC++ TaskTray应用程序的过程中,在C#.NET中,我发现以下方法真正可行以实现以下目的.
启动时没有初始形式
运行Message Loop,可以根据需要与Invoke/BeginInvoke一起使用,因为IsWindowHandle为true
我遵循的步骤:
在Application.Run()中使用ApplicationContext而不是表单.有关我使用的示例,请参阅http://www.codeproject.com/Articles/18683/Creating-a-Tasktray-Application.
在GUI Designer 中将Form的ShowInTaskbar属性设置为true.(这似乎适得其反,但它有效)
将Form Class设置Visible和ShowInTaskbar中的OnLoad()方法重写为false,如下所示.
protected override void OnLoad(EventArgs e) { Visible = false; ShowInTaskbar = false; base.OnLoad(e); }
我知道这是一个老问题,但它在谷歌排名很好,所以无论如何我都会提供我的解决方案.
我做了两件事:
private void Form_Load(object sender, EventArgs e) { Opacity = 0; } private void Form_Shown(object sender, EventArgs e) { Visible = false; Opacity = 100; }
最好的方法是在构造函数中使用以下1-2行:
this.WindowState = FormWindowState.Minimized; this.ShowInTaskbar = false; // This is optional
您甚至可以在VS Property窗口中设置Minimized属性.
您可以创建一个继承自的类System.Windows.Forms.NativeWindow
(提供基本的消息循环功能),并Handle
在其构造函数中引用该属性以创建其句柄并将其挂钩到消息循环中.一旦拨打电话Application.Run
,您就可以处理来自它的消息.