WndProc没有可见的forms?

我想在第二个线程上创建一个表单,它将在它的WndProc方法中接收消息。 建立这样一个不可见forms的推荐方法是什么? 设置“ShowInTaskbar = false”和“Visible = false”是否足够,或者是否有“更清洁”的方式?

我不确定“清洁”是什么意思。 创建用户不可见的表单的标准方法是将Visible和ShowInTaskbar设置为false。

据我所知,你正在做的是反对规则(虽然,这些事情有时会起作用)……所有UI的东西都应该在主线程中。

至于你的问题,你应该能够将Visible设置为false。 我相信,设置ShowInTaskbar对于主应用程序表单只会很重要,如果你这样做,用户将无法从任务栏返回你的应用程序。

这个项目中的代码有一个处理这个问题的简洁方法: http : //www.codeproject.com/KB/dotnet/XDMessaging.aspx

我不是在这里复制代码,因为它受版权保护,但你可以自己下载它来作为参考。

XDListener类扩展了NativeWindow,因此它能够接收消息。 在构造函数中,在窗口上设置了一些属性,使其不可见。 在该类中重写WndProc方法以处理到达的消息。 我测试了这个代码在Win 7上使用C#应用程序,而我的所有表单都是隐藏的,而不是在TaskBar中显示。

如果将ShowInTaskbar设置为false,则无法接收Windows消息。 唯一的方法是隐藏您的表单(它仍然隐藏任务栏图标)。

使用:

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 

注意:你可以在声明中将lpClassNamelpWindowName更改为stringlong ,确保使用“Static”作为lpClassName成员 – 这是你想要的通常用于接收wndproc窗口的不可见窗口样式。

这个api的返回值是你可以子类化的hwnd(句柄)来获取它将收到所有标准窗口消息的消息,或者你可以向它发送自定义消息,因此当标准消息是标准消息时它不会意外触发你的代码接收。

示例: hwnd_main是其父窗口的hwnd

 dim hwnd_recieve as long hwnd_recieve = CreateWindowEx(num_zero, "Static", "",0,0,0,0,0, hwnd_main,0,0,0) 

这是一个子类,玩得开心!