- ベストアンサー
wndProcを用いたUSBデバイスの抜差し検知
- VC++2008のC++/CLIを利用してwindows formアプリケーションを作成しています。
- USBカメラの抜挿しを検知するためのコードを作成しましたが、m.WParamの値が常に'7'のまま変わらず、条件式が評価されません。
- USBカメラの抜挿しを正常に検知する方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
見直したハズですが、アホな誤字があったので訂正。 ># 接続したUSB2.0 Cameraのプロパティ、詳細の「デバイカクラスGUID」の値。 「デバイス クラス GUID」です。
その他の回答 (3)
- Wr5
- ベストアンサー率53% (2173/4061)
というワケでやってみました。(VS2005でC++/Win32アプリケーション。実行環境はWindows7 Pro 64Bit) # 結果としては正しいのか不明ですが…。 WM_CREATEの際に DEV_BROADCAST_DEVICEINTERFACE devif; ZeroMemory( &devif, sizeof(DEV_BROADCAST_DEVICEINTERFACE) ); devif.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); devif.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; devif.dbcc_classguid = GUID_USBCAMERA; hDevNotify = RegisterDeviceNotification( hWnd, &devif, DEVICE_NOTIFY_WINDOW_HANDLE ); で登録。 # hDevNotifyはグローバル変数で型はHDEVNOTIFY。 # WM_DESTROYでUnregisterDeviceNotification()で後始末しています。 dbcc_classguidに設定するGUIDの問題なのか…結局通知されませんでした。 DEFINE_GUID(GUID_USBCAMERA,0x6BDD1FC6, 0x810F, 0x11D0, 0xBE, 0xC7, 0x08, 0x00, 0x2B, 0xE2, 0x09, 0x2F); で設定してみましたが変わらず。 # 接続したUSB2.0 Cameraのプロパティ、詳細の「デバイカクラスGUID」の値。 # ちなみに製品はBSW13KE09HSV。 dbcc_classguidを未設定に、RegisterDeviceNotification()の第3引数をDEVICE_NOTIFY_ALL_INTERFACE_CLASSESにすると、 DBT_DEVICEARRIVAL/DBT_DEVICEREMOVECOMPLETEが通知されます。 USBの抜き差しを行うとDEV_BROADCAST_DEVICEINTERFACE構造体のdbcc_classguidが{A5DCBF10-6530-11D2-901F-00C04FB951ED}の通知が来ます。 # WinDDKをインストールしていればGUID_DEVINTERFACE_USB_DEVICEまたはGUID_CLASS_USB_DEVICEで定義されている。 USB抜き差し全般で通知を有効にした上でUSBカメラを接続すると、 {A5DCBF10-6530-11D2-901F-00C04FB951ED} {6994AD05-93EF-11D0-A3CC-00A0C9223196} {65E8773D-8F56-11D0-A3B9-00A0C9223196} が通知されました。 レジストリを検索すると… {6994AD05-93EF-11D0-A3CC-00A0C9223196}がUSBカメラでした。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{6994AD05-93EF-11D0-A3CC-00A0C9223196}\##?#USB#VID_1E4E&PID_0103&MI_00#6&1810EB48&0&0000#{6994ad05-93ef-11d0-a3cc-00a0c9223196}\#GLOBAL\Device Parameters のFriendlyNameが"USB2.0 Camera"でした。(デバイスマネージャで表示されるもの。たぶん環境依存。) # ちなみに65E8773D-8F56-11D0-A3B9-00A0C9223196はAM_KSCATEGORY_CAPTURE、 # 6994AD05-93EF-11D0-A3CC-00A0C9223196はAM_KSCATEGORY_VIDEOとしてksuuids.hで登録されていました。 上記のGUID_USBCAMERAを6994AD05-93EF-11D0-A3CC-00A0C9223196に設定してDEVICE_NOTIFY_WINDOW_HANDLEでRegisterDeviceNotification()することで… とりあえずUSBカメラの抜き差しを検出できました。 # ただし…6994AD05-93EF-11D0-A3CC-00A0C9223196がどの環境でもUSBカメラになるかは不明です。 # WindowsSDKで定義されているのだから…固定ですかねぇ。 # どのファイルをインクルードして使うのかはよくわかりませんでしたが。
- Wr5
- ベストアンサー率53% (2173/4061)
>上記の設定は具体的にどのようにすれば実現できますでしょうか? 具体的に…と問われても…… USB-Serial変換かせいぜいUSBメモリの場合しか試したことはありませんから、 USBカメラ(Webカメラ?)がどのようになるのかは不明です。 「RegisterDeviceNotification」で検索すると使い方とか説明しているページがいくつか見つかるはずですから、 そちらのサンプル等を参照して試行錯誤…でしょうかね。 # 接続するUSBカメラによっても対応が変わる可能性がありますし……。 一般的なUSBカメラ(UVC対応カメラ)の場合のGUIDでもあれば、あるいは一般化できるのかも知れませんが。 # 家に帰れば…UVC対応カメラがあったハズ(あきばお~で処分価格で売っていたモノを1つ買ったので)。 あとは…もしかしたらDDKも必要かも知れないですな。 # C++/CLIは不明。
- Wr5
- ベストアンサー率53% (2173/4061)
接続しているUSBカメラはストレージとして使えるタイプではない…ということでしょうか? # デジカメなんかとUSB接続だとリムーバブルストレージとして見えたりしますが。 USB-Serial変換やUSB-Parallel変換、またはリムーバブルストレージ(カードリーダ系も含む。ドライブ名が割り当て可能なものですかね)ならば 特に設定しなくてもOSから通知が来ますが、それ以外のデバイスの場合は予め設定しておかないと通知の種類が少ない…のでしょう。 # USBなBluetoothドングルだと…シリアルポートとして反応するんだろうか……。
お礼
ご回答ありがとうございます。 >>リムーバブルストレージならば特に設定しなくてもOSから通知が来ます... 上記をもとに,USBメモリーを抜挿しした場合は,正常にコードは動作しました。 使用中のUSBカメラはストレージとして使用できるタイプではないようです。 リンク先を拝見しましが,RegisterDeviceNotificationの使用方法がわかりませんでした... >>それ以外のデバイスの場合は予め設定しておかないと... 上記の設定は具体的にどのようにすれば実現できますでしょうか?