6

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

但是,当表单最小化时,我不再收到任何消息。我知道它必须是这样的,但是有解决方法吗?我不想有一个始终保持打开状态的隐藏表单...

4

3 回答 3

10

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

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 窗体创建仅消息窗口?

于 2011-08-11T21:55:20.140 回答
3

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

这里有更多关于 MSDN 的主题。不过需要提醒的是,它需要大量使用 Window API,因为 .NET 不直接支持仅消息窗口。

于 2011-07-22T07:42:27.250 回答
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
于 2013-04-20T21:06:34.057 回答