2

USB HID と通信できる C# アプリケーションを開発しようとしています。WndProc メソッドをオーバーライドして、すべての WM_DEVICECHANGE イベントをキャッチし、DeviceChange メソッドをメソッド OnDeviceChange (このコードは実際には Jan Axelson から借用したもの) に渡します。これは次のようになります....

protected override void WndProc( ref Message m ) 
{            
    try 
    { 
        //  The OnDeviceChange routine processes WM_DEVICECHANGE messages.

        if ( m.Msg == DeviceManagement.WM_DEVICECHANGE ) 
        { 
            OnDeviceChange( m ); 
        } 

        //  Let the base form process the message.

        base.WndProc( ref m );                 
    } 
    catch ( Exception ex ) 
    { 
        DisplayException( this.Name, ex ); 
        throw ; 
    }             
} 

ただし、何らかの理由で、デバイスを接続するたびに、それがマウス、キーボード、または開発中のデバイスであるかどうかにかかわらず、すべて HID であり、WParam の値は常に 0x7 です。

DBT.h をチェックインしたところ、0x0007 の値は ...

#define DBT_DEVNODES_CHANGED            0x0007

/*
 * Message = WM_DEVICECHANGE
 * wParam  = DBT_QUERYCHANGECONFIG
 * lParam  = 0
 *
 *      sent to ask if a config change is allowed
 */....

最初のメッセージが届いた後に停止するだけではなく、すべてのメッセージを調べて、すべてのメッセージの値が常に 0x0007 になるようにします。DeviceAttached または DeviceRemoved イベントが表示されないのはなぜですか?

USBの経験がある人は何か考えがありますか?

4

2 に答える 2

1

取り付けおよび取り外しを受け取るには、デバイスを登録する必要があります。RegisterDeviceNotificationを参照してください。 これがあなたを動かすための素晴らしい例です

于 2010-01-11T23:54:17.330 に答える
0

デバッグ セッションでは、Visual Studio はメッセージを省略できます。

なぜ と の両方が欠落したのか理解できませんDBT_DEVICEARRIVALでしDBT_DEVICEREMOVECOMPLETEた。line でブレークポイントを設定解除するだけ if ( m.Msg == DeviceManagement.WM_DEVICECHANGE )です。

投稿が閉じられていなかったので返信しました。

于 2012-06-11T14:04:43.723 に答える