要与某项服务进行通信,我必须覆盖WindProc
。并接收窗口消息。
但是,当表单最小化时,我不再收到任何消息。我知道它必须是那样的,但有没有解决方法呢?我不希望有一个永远敞开的隐藏形式......
答案 0 :(得分:9)
我最近还需要解决类似的问题。亚伯的回答让我朝着正确的方向前进。以下是通过将普通窗口更改为仅消息窗口的完整示例:
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?
答案 1 :(得分:3)
如果您希望接收窗口消息,但不想显示接收窗体消息的表单,则可以使用永不显示的仅消息窗口。如果您使用它,则不再需要用于与用户交互的实际C#表单来接收来自窗口服务的消息。
Here's more on the subject as MSDN。但是需要警告,它需要使用Window API,因为.NET不直接支持仅消息窗口。
答案 2 :(得分:0)
您可以尝试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