WndProc: How to get window messages when form is minimized

前端 未结 3 1649
夕颜
夕颜 2021-01-02 22:01

To communicate with a certain service, I have to override the WindProc. and receive window messages.

However, when the form is minimized, I get no longe

相关标签:
3条回答
  • 2021-01-02 22:19

    I've also needed to solve a similar problem recently. Abel's answer set me on the right direction. Here is a complete example of how I did it, by changing a normal window into a message-only window:

    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
      } 
    }
    

    Pay attention to the constructor: I've found that I need to access the Handle property or otherwise the OnHandleCreated method won't get called. Not sure of the reason, perhaps someone can explain why.

    I believe my sample code also would answer a related question: How do I create a message-only window from windows forms?

    0 讨论(0)
  • 2021-01-02 22:26

    You can try NativeWindow to receive messages (VB code, sorry):

    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
    
    0 讨论(0)
  • 2021-01-02 22:31

    If you want to receive window messages, but don't want to show a form for receiving them, you can use a message-only window, which is never displayed. If you use that, the actual C# Form you use for interacting with the user is no longer needed to also receive the messages from your window service.

    Here's more on the subject as MSDN. A warning though, it requires quite a bit of playing around with the Window API, because a message-only window is not directly supported by .NET.

    0 讨论(0)
提交回复
热议问题