【发布时间】:2011-07-22 07:23:34
【问题描述】:
要与某个服务通信,我必须覆盖WindProc。并接收窗口消息。
但是,当表单最小化时,我不再收到任何消息。我知道它必须是这样的,但是有解决方法吗?我不想有一个始终保持打开状态的隐藏表单...
【问题讨论】:
-
您查看过
NC_*消息吗?就像标题栏中的悬停一样,这也可能是“非客户区”。另外:窗口消息是什么意思?就像鼠标悬停在最小化的表单上一样?
要与某个服务通信,我必须覆盖WindProc。并接收窗口消息。
但是,当表单最小化时,我不再收到任何消息。我知道它必须是这样的,但是有解决方法吗?我不想有一个始终保持打开状态的隐藏表单...
【问题讨论】:
NC_* 消息吗?就像标题栏中的悬停一样,这也可能是“非客户区”。另外:窗口消息是什么意思?就像鼠标悬停在最小化的表单上一样?
我最近也需要解决类似的问题。亚伯的回答让我朝着正确的方向前进。这是一个完整的例子,说明我是如何做到的,将普通窗口更改为仅消息窗口:
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 方法将不会被调用。不知道是什么原因,也许有人可以解释一下。
我相信我的示例代码也会回答一个相关问题:How do I create a message-only window from windows forms?
【讨论】:
如果您想接收窗口消息,但不想显示用于接收它们的表单,您可以使用仅显示消息的窗口,该窗口从不显示。如果您使用它,则不再需要您用于与用户交互的实际 C# 表单来接收来自您的窗口服务的消息。
Here's more on the subject as MSDN。不过需要提醒的是,它需要大量使用 Window API,因为 .NET 不直接支持仅消息窗口。
【讨论】:
您可以尝试NativeWindow接收消息(VB代码,对不起):
Imports System.Windows.Forms
Public Class MyClass: Inherits NativeWindow
Private piFormHandle As Integer = 0
Sub New()
Me.CreateHandle(New CreateParams)
piFormHandle = CInt(Me.Handle)
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Select Case (m.Msg)
Case MyMessage
End Select
MyBase.WndProc(m)
End Sub
End Class
【讨论】: