Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WndProc:最小化窗体时如何获取窗口消息_C#_Wndproc - Fatal编程技术网

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

C# WndProc:最小化窗体时如何获取窗口消息,c#,wndproc,C#,Wndproc,要与某个服务通信,我必须覆盖WindProc。并接收窗口消息 然而,当表单最小化时,我不再收到任何消息。我知道必须是这样的,但有解决办法吗?我不希望有一个始终打开的隐藏窗体…如果您希望接收窗口消息,但不希望显示用于接收消息的窗体,则可以使用从不显示的仅消息窗口。如果您使用它,那么您用于与用户交互的实际C表单就不再需要从窗口服务接收消息 。不过有一个警告,它需要大量使用窗口API,因为.NET不直接支持只显示消息的窗口。最近我还需要解决一个类似的问题。亚伯的回答使我走上了正确的方向。下面是一个完整

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


然而,当表单最小化时,我不再收到任何消息。我知道必须是这样的,但有解决办法吗?我不希望有一个始终打开的隐藏窗体…

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


。不过有一个警告,它需要大量使用窗口API,因为.NET不直接支持只显示消息的窗口。

最近我还需要解决一个类似的问题。亚伯的回答使我走上了正确的方向。下面是一个完整的示例,通过将普通窗口更改为仅显示消息的窗口,我完成了此操作:

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方法将不会被调用。不确定原因,也许有人能解释原因

我相信我的示例代码也会回答一个相关问题:

您可以尝试NativeWindow接收消息VB代码,抱歉:

导入System.Windows.Forms 公共类MyClass:继承NativeWindow 私有piFormHandle作为整数=0 次新 Me.CreateHandleNew CreateParams piFormHandle=CIntMe.Handle 端接头 受保护的覆盖子WndProcByRef m作为System.Windows.Forms.Message 选择Case m.Msg 案例MyMessage 结束选择 MyBase.WndProcm 端接头 末级
你看过NC_u*信息了吗?就像标题栏中的悬停一样,这也可能是非客户区。还有:你说的窗口消息是什么意思?就像鼠标悬停在最小化窗体上一样?注意:必须将ShowInTaskbar设置为false。注意:如果您想从另一个进程发送消息,则仅消息窗口是无用的,因为尽管MSDN说应使用FindWindowEx找到仅消息窗口,但事实并非如此。