1

私は決して 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したときにメッセージが渡されませんでした。PreFilterMessagewindow - WndProc オーバーライドのみを渡します。

明らかに、ウィンドウ メッセージに関する私の理解は完全には程遠いですが、何が欠けていたのでしょうか?

WM_DEVICECHANGEメインウィンドウを通過せずにキャッチする方法はありますか? そして、将来のために私を助けるために:どのウィンドウメッセージがどこに送られ、どこに送られず、なぜ送られるのか、良い参照を見つけるためにどこを調べなければなりませんか?

4

0 に答える 0