1

I'm by no means a windows message expert - so forgive me if I'm asking something stupid, but I wasn't able to help myself:

I have a form hooking up to Windows Messages by overriding WndProc to get notified when usb devices are connected or removed (WM_DEVICECHANGE). Everything works fine.

When I moved this code to an underlying user control, I was surprised that it wasn't called any more for WM_DEVICECHANGE messages - other messages do get catched though. Here's the code I used to override.

    private const int WM_DEVICECHANGE = 0x0219;

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_DEVICECHANGE:

                //Device changed - do something
                //never passing here when overriding in UserControl
                //works when overridden in my main form.
                break;
        }
        base.WndProc(ref m);
    }

Further looking for ways to resolve without simply putting the code back in the form, I found the IMessageFilter Interface but implementing and registering it with Application.AddMessageFilter didn't resolve my issue - in fact the WM_DEVICECHANGE message didn't even pass on my PreFilterMessage when I registered my main window - it only passes the WndProc override.

So obviously my understanding of window-messages is far from complete, but what did I miss?

Is there a way to catch WM_DEVICECHANGE without passing by the main window? And to help me for the future: Where would I have to look into to find a good reference which Window Messages get sent where and where not and why?

Marwie
  • 3,177
  • 3
  • 28
  • 49
  • 1
    No, this message is only sent to a top-level window. The kind that the Form class creates. It does not have to be visible, call CreateHandle() instead of Show(). – Hans Passant Apr 13 '16 at 15:27

0 Answers0