我绝不是一个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发送到何处和何处以及为什么?