1

我绝不是 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不经过主窗口的情况下捕捉?并为我的未来提供帮助:我必须在哪里寻找一个很好的参考,哪些窗口消息被发送到哪里和哪里不发送,为什么?

4

0 回答 0