私は決して Windows メッセージの専門家ではないので、ばかげたことを尋ねている場合はご容赦ください。
USBデバイスが接続または削除されたときに通知を受け取るためにWndProcをオーバーライドすることにより、Windowsメッセージに接続するフォームがあります( 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
window - WndProc オーバーライドのみを渡します。
明らかに、ウィンドウ メッセージに関する私の理解は完全には程遠いですが、何が欠けていたのでしょうか?
WM_DEVICECHANGE
メインウィンドウを通過せずにキャッチする方法はありますか? そして、将来のために私を助けるために:どのウィンドウメッセージがどこに送られ、どこに送られず、なぜ送られるのか、良い参照を見つけるためにどこを調べなければなりませんか?