C# WndProc:最小化窗体时如何获取窗口消息
要与某个服务通信,我必须覆盖WindProc。并接收窗口消息C# WndProc:最小化窗体时如何获取窗口消息,c#,wndproc,C#,Wndproc,要与某个服务通信,我必须覆盖WindProc。并接收窗口消息 然而,当表单最小化时,我不再收到任何消息。我知道必须是这样的,但有解决办法吗?我不希望有一个始终打开的隐藏窗体…如果您希望接收窗口消息,但不希望显示用于接收消息的窗体,则可以使用从不显示的仅消息窗口。如果您使用它,那么您用于与用户交互的实际C表单就不再需要从窗口服务接收消息 。不过有一个警告,它需要大量使用窗口API,因为.NET不直接支持只显示消息的窗口。最近我还需要解决一个类似的问题。亚伯的回答使我走上了正确的方向。下面是一个完整
然而,当表单最小化时,我不再收到任何消息。我知道必须是这样的,但有解决办法吗?我不希望有一个始终打开的隐藏窗体…如果您希望接收窗口消息,但不希望显示用于接收消息的窗体,则可以使用从不显示的仅消息窗口。如果您使用它,那么您用于与用户交互的实际C表单就不再需要从窗口服务接收消息
。不过有一个警告,它需要大量使用窗口API,因为.NET不直接支持只显示消息的窗口。最近我还需要解决一个类似的问题。亚伯的回答使我走上了正确的方向。下面是一个完整的示例,通过将普通窗口更改为仅显示消息的窗口,我完成了此操作:
class MessageWindow : Form {
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
public MessageWindow() {
var accessHandle = this.Handle;
}
protected override void OnHandleCreated(EventArgs e) {
base.OnHandleCreated(e);
ChangeToMessageOnlyWindow();
}
private void ChangeToMessageOnlyWindow() {
IntPtr HWND_MESSAGE = new IntPtr(-3);
SetParent(this.Handle, HWND_MESSAGE);
}
protected override void WndProc(ref Message m) {
// respond to messages here
}
}
注意构造函数:我发现我需要访问Handle属性,否则OnHandleCreated方法将不会被调用。不确定原因,也许有人能解释原因
我相信我的示例代码也会回答一个相关问题:您可以尝试NativeWindow接收消息VB代码,抱歉:
导入System.Windows.Forms
公共类MyClass:继承NativeWindow
私有piFormHandle作为整数=0
次新
Me.CreateHandleNew CreateParams
piFormHandle=CIntMe.Handle
端接头
受保护的覆盖子WndProcByRef m作为System.Windows.Forms.Message
选择Case m.Msg
案例MyMessage
结束选择
MyBase.WndProcm
端接头
末级
你看过NC_u*信息了吗?就像标题栏中的悬停一样,这也可能是非客户区。还有:你说的窗口消息是什么意思?就像鼠标悬停在最小化窗体上一样?注意:必须将ShowInTaskbar设置为false。注意:如果您想从另一个进程发送消息,则仅消息窗口是无用的,因为尽管MSDN说应使用FindWindowEx找到仅消息窗口,但事实并非如此。