我想在第二个线程上创建一个表单,它将在它的 WndProc 方法中接收消息。创建这样的不可见表单的推荐方法是什么?设置“ShowInTaskbar=false”和“Visible=false”是否足够,或者是否有“更清洁”的方式?
5 回答
我不确定您所说的“更清洁”是什么意思。创建对用户不可见的表单的标准方法是将 Visible 和 ShowInTaskbar 设置为 false。
据我所知,您正在做的事情违反了规则(尽管这些事情有时确实有效)......所有 UI 的东西都应该在主线程中。
至于您的问题,您应该可以将 Visible 设置为 false。我相信,设置 ShowInTaskbar 仅对主应用程序表单很重要,如果您这样做,用户将无法从任务栏返回您的应用程序。
采用:
Public Declare Function CreateWindowExA Lib "user32" (ByVal dwExStyle As Long,
ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long,
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long,
ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any)
As Long
或者
Public Declare Function CreateWindowExW Lib "user32" (ByVal dwExStyle As Long,
ByVal lpClassName As Long, ByVal lpWindowName As Long, ByVal dwStyle As Long,
ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long,
ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Long)
As Long
注意:您可以在声明中将 or 更改为or确保lpClassName
使用“Static”作为成员 - 这是您想要的不可见窗口样式,通常用于接收 wndproc 窗口。lpWindowName
string
long
lpClassName
此 api 的返回值是 hwnd(handle),您可以对它进行子类化以获取它将接收所有标准 Windows 消息的消息,或者您可以向它发送自定义消息,因此当标准消息时它不会意外触发您的代码已收到。
示例:
hwnd_main
是其父窗口的 hwnd
dim hwnd_recieve as long
hwnd_recieve = CreateWindowEx(num_zero, "Static", "",0,0,0,0,0, hwnd_main,0,0,0)
继承这个并玩得开心!
这个项目中的代码有一个巧妙的方法来处理这个问题: http: //www.codeproject.com/KB/dotnet/XDMessaging.aspx
我这里没有复制代码,因为它是受版权保护的,但是您可以通过自己下载它来参考它。
XDListener 类扩展了 NativeWindow,因此它能够接收消息。在构造函数中,在窗口上设置了一些属性,使其不可见。WndProc 方法在该类中被重写以处理到达的消息。我测试了这段代码可以在 Win 7 上使用 C# 应用程序运行,而我的所有表单都被隐藏并且没有显示在任务栏中。
如果将 ShowInTaskbar 设置为 false,您将无法接收 Windows 消息。唯一的方法是隐藏您的表单(它仍然隐藏任务栏图标)。