WndProc:如何在窗体最小化时获取窗口消息

要与某个服务进行通信,我必须覆盖WindProc 。 并接收窗口消息。

但是,当表单最小化时,我不再收到任何消息。 我知道它必须是那样的,但有没有解决方法呢? 我不希望有一个永远敞开的隐藏forms……

我最近还需要解决类似的问题。 亚伯的回答让我朝着正确的方向前进。 这是一个完整的示例,通过将普通窗口更改为仅消息窗口,我是如何做到的:

 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方法。 不确定原因,也许有人可以解释原因。

我相信我的示例代码也会回答一个相关的问题: 如何从Windows窗体创建一个仅限消息的窗口?

如果您希望接收窗口消息,但不想显示接收窗体消息的表单,则可以使用永不显示的仅消息窗口。 如果您使用它,则不再需要用于与用户交互的实际C#表单来接收来自窗口服务的消息。

这里有关于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