【问题标题】:WndProc: How to get window messages when form is minimizedWndProc:最小化表单时如何获取窗口消息
【发布时间】:2011-07-22 07:23:34
【问题描述】:

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

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

【问题讨论】:

  • 您查看过NC_* 消息吗?就像标题栏中的悬停一样,这也可能是“非客户区”。另外:窗口消息是什么意思?就像鼠标悬停在最小化的表单上一样?

标签: c# wndproc


【解决方案1】:

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

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?

【讨论】:

  • 注意:您必须设置 ShowInTaskbar = false。注意:如果您想从另一个进程发送消息,则仅消息窗口是无用的,因为尽管 MSDN 说应该使用 FindWindowEx 找到仅消息窗口,但事实并非如此。
【解决方案2】:

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

Here's more on the subject as MSDN。不过需要提醒的是,它需要大量使用 Window API,因为 .NET 不直接支持仅消息窗口。

【讨论】:

    【解决方案3】:

    您可以尝试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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2011-05-22
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多