有没有办法Usercontrols或IMessageFilter实现可以获得WM_DEVICECHANGE消息?

时间:2016-04-13 15:16:22

标签: c# winforms window-messages

我绝不是一个Windows消息专家 - 所以请原谅我,如果我问一些愚蠢的事情,但我无法帮助自己:

我通过覆盖WndProc来连接到Windows消息,以便在连接或删除USB设备时收到通知(WM_DEVICECHANGE)。一切正常。

当我将此代码移动到底层用户控件时,我很惊讶它不再被WM_DEVICECHANGE消息调用 - 但其他消息确实被捕获了。这是我用来覆盖的代码。

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

进一步寻找解决问题的方法而不是简单地将代码放回到表单中,我找到了IMessageFilter接口,但实现并使用Application.AddMessageFilter注册它并没有解决我的问题 - 实际上当我注册主窗口时,WM_DEVICECHANGE消息甚至没有通过我的PreFilterMessage - 它只传递了WndProc覆盖。

很明显,我对窗口信息的理解还远未完成,但我错过了什么?

有没有办法在不经过主窗口的情况下捕获WM_DEVICECHANGE?并帮助我实现未来:我需要在哪里找到一个很好的参考资料,将Window Messages发送到何处和何处以及为什么?

0 个答案:

没有答案