Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WndProc: How to get window messages when form is minimized

Tags:

c#

wndproc

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 longer any message. I know that it has to be like that, but is there a workaround for this? I don't want to have a hidden form which stays always open...

like image 358
lenniep Avatar asked Jul 22 '11 07:07

lenniep


1 Answers

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?

like image 110
jrequejo Avatar answered Sep 18 '22 01:09

jrequejo