7

現在、WM_DEVICECHANGEを使用して、新しいUSBドライブがコンピューターに接続されたときに通知を受け取ります。これは、デバイスが到着するとすぐにファイルを読み取る準備ができているサムドライブなどのデバイスに最適です。SDカードリーダーなどのデバイスの場合、デバイスが接続されたときにメッセージが1回送信されるためではなく、ユーザーが実際にデバイスにカードを挿入したときにメッセージが送信されないためです。

ポーリングを使用せずに、既存のUSBデバイスへの新しいメディアの挿入を検出することは可能ですか?

4

4 に答える 4

9

私は数週間前にこれをしました。技術的に言えば、RegisterDeviceNotificationルートは適切な方法ですが、正しく実行するにはかなりの量の作業が必要です。ただし、Windowsエクスプローラーはすでにすべてのハードワークを実行します。SHChangeNotifyRegisterをSHCNE_DRIVEADD/SHCNE_DRIVEREMOVED / SHCNE_MEDIAINSERTED/SHCNE_MEDIAREMOVEDと一緒に使用するだけです。この方法は、シェルハードウェア検出サービス(またはそれが呼び出されるもの)に依存しますが、機能を自分で再実装しようとするよりもはるかに簡単であることに注意してください。

于 2010-03-11T01:47:34.967 に答える
2

SHChangeNotifyRegister「ChangeNotifyWatcherSample」の使用例は非常に良い例です。このアドレスからダウンロードしてください:

http://msdn.microsoft.com/en-us/library/dd940348.aspx#downloading

QtコードにSHChangeNotifyRegisterを実装しました。

彼の非常に良い答えをくれたルークに感謝します!

于 2011-11-17T08:54:38.203 に答える
0

SDリーダードライバーのバグである可能性があります。WM_DEVICECHANGEの説明は、「DBT_DEVICEARRIVAL 0x8000デバイスまたはメディアが挿入され、使用可能になりました」です。

したがって、メディア挿入の通知を受け取ることになっています。

RegisterDeviceNotificationを使用してみましたか?デフォルトでは一部の通知のみが送信され、メディアの変更はそれらの1つではない場合があります。

于 2010-03-10T22:46:08.720 に答える
0

おそらくそれはデバイスドライバのバグです(私は確かにそうだと思います)が、それらはすべて同じように機能しているように見えます...そうではありません。したがって、現時点では、Microsoft(おそらく最大の開発者)がこのように機能するはずだとあなたに信じさせても(私のWindows7 Microsoftドライバーでは機能しない)、デバイスドライバー開発者にデバイスの特性を変更させることはできないと思います。SDカードをUSBデバイスに挿入しても、WM_DEVICECHANGEメッセージはトリガーされません。

メディアタイプのデバイスにはSHChangeNotifyRegisterを使用します。レジスタデバイス通知は必要ありません。また、SHGetPathFromIDListを介してドライブ文字を取得できます。SHCNE_MEDIAINSERTEDおよびSHCNE_MEDIAREMOVEDを使用します。

メディアデバイスではなくハードウェアデバイスを探している場合は、デバイスONDeviceNotifyを使用してください。そうでない場合は、独自のデバイスドライバーを作成できる可能性があります。

このコメントのコードを参照してくださいCodeProject-Windowsメッセージのトラップ

于 2010-05-30T00:01:33.587 に答える