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