質問者
WM_DEVICECHANGE の DBT_DEVICEARRIVAL と DBT_DEVICEREMOVECOMPLETEについて

質問
-
USBのファクションドライバとWINアプリ、デバイス側のファーム作ってます。
WINアプリ側で表題のメッセージ捕まえて、デバイスの接続状態確認していたのですが、
自作のドライバではWM_DEVICECHANGEは発生するのですが、
lParam=00000000/wParam=00000007のwmしか発生しません。
ドライバのPnPの ”IRP_MN_START_DEVICE" / "IRP_MN_SURPRISE_REMOVAL"
辺りの記述が何か足りないのでしょうか?- 移動 Mike Wang (MSCS) 2012年10月2日 11:25 (移動元:Windows デバイスドライバー開発)
すべての返信
-
自己レスです。
DBT_DEVICEARRIVAL(0x8000)/ DBT_DEVICEREMOVECOMPLETE(0x8004)
はメディアデバイス固有のwParamaなのですね・・・;^_^
http://msdn.microsoft.com/en-us/library/aa363480.aspx
USBメモリを挿した時は発生するのに、自作デバイス挿した時は何も起こらないので
又、何かしでかしてしまったかと思ってしまいました。
お騒がせしました。 -
y-nagaokaさん
一般的には、デバイスの通知を受けたい場合、RegisterDeviceNotification()を呼ぶ必要があります。
http://msdn.microsoft.com/en-us/library/aa363431(VS.85).aspx
RegisterDeviceNotification()のパラメータですが、すべてのUSBデバイスの通知を受ける場合、DBT_DEVTYP_DEVICEINTERFACE で、GUID をGUID_CLASS_USB_DEVICEに指定しますと、うまくいくと思います。独自のデバイスのみの通知を受けたい場合、そのデバイスのファンクションドライバで登録したデバイスインタフェースのGUIDを使用してください。
ボリュームデバイスとポートクラスのデバイスだけは、変則的で、RegisterDeviceNotification()を呼ばなくても、通知されます。この点について、同じMSDNのドキュメントにこんな記述があります。
The DBT_DEVICEARRIVAL and DBT_DEVICEREMOVECOMPLETE events are automatically broadcast to all top-level windows for port devices. Therefore, it is not necessary to call RegisterDeviceNotification for ports, and the function fails if the dbch_devicetype member is DBT_DEVTYP_PORT. Volume notifications are also broadcast to top-level windows, so the function fails if dbch_devicetype is DBT_DEVTYP_VOLUME.- 回答の候補に設定 cleng_sdMicrosoft employee 2009年6月22日 13:39