現在VC++2008のC++/CLIを用いてwindows form アプリケーションを作成しています。
USBカメラの抜挿しを検知しようと思い,http://d.hatena.ne.jp/shiwork/20100126/1264453129のサイトを参考にさせていただき,下記のコードを書きました。
#include <windows.h>
#include <Dbt.h>
virtual void WndProc(System::Windows::Forms::Message% m) override
{
if(m.Msg == WM_DEVICECHANGE)
{
switch((int)(m.WParam))
{
case DBT_DEVICEREMOVECOMPLETE:
MessageBox::Show("out");
break;
case DBT_DEVICEARRIVAL:
MessageBox::Show("in");
break;
}
}
Form::WndProc(m);
}
このコードをステップ実行してみたところ,USBカメラを抜いても挿しても,m.WParamの値は '7'のままで変わりません。またswitchで一時停止し,F10で1ステップ実行したところ,すぐにswitchを抜けてしまい,条件式を全く評価していないようでした。
どのようにすれば,USBカメラの抜挿しを正常に検知できるでしょうか?
No.4ベストアンサー
- 回答日時:
見直したハズですが、アホな誤字があったので訂正。
># 接続したUSB2.0 Cameraのプロパティ、詳細の「デバイカクラスGUID」の値。
「デバイス クラス GUID」です。
No.3
- 回答日時:
というワケでやってみました。
(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で定義されているのだから…固定ですかねぇ。
# どのファイルをインクルードして使うのかはよくわかりませんでしたが。
No.2
- 回答日時:
>上記の設定は具体的にどのようにすれば実現できますでしょうか?
具体的に…と問われても……
USB-Serial変換かせいぜいUSBメモリの場合しか試したことはありませんから、
USBカメラ(Webカメラ?)がどのようになるのかは不明です。
「RegisterDeviceNotification」で検索すると使い方とか説明しているページがいくつか見つかるはずですから、
そちらのサンプル等を参照して試行錯誤…でしょうかね。
# 接続するUSBカメラによっても対応が変わる可能性がありますし……。
一般的なUSBカメラ(UVC対応カメラ)の場合のGUIDでもあれば、あるいは一般化できるのかも知れませんが。
# 家に帰れば…UVC対応カメラがあったハズ(あきばお~で処分価格で売っていたモノを1つ買ったので)。
あとは…もしかしたらDDKも必要かも知れないですな。
# C++/CLIは不明。
No.1
- 回答日時:
接続しているUSBカメラはストレージとして使えるタイプではない…ということでしょうか?
# デジカメなんかとUSB接続だとリムーバブルストレージとして見えたりしますが。
USB-Serial変換やUSB-Parallel変換、またはリムーバブルストレージ(カードリーダ系も含む。ドライブ名が割り当て可能なものですかね)ならば
特に設定しなくてもOSから通知が来ますが、それ以外のデバイスの場合は予め設定しておかないと通知の種類が少ない…のでしょう。
# USBなBluetoothドングルだと…シリアルポートとして反応するんだろうか……。
参考URL:http://social.msdn.microsoft.com/Forums/ja-JP/wi …
ご回答ありがとうございます。
>>リムーバブルストレージならば特に設定しなくてもOSから通知が来ます...
上記をもとに,USBメモリーを抜挿しした場合は,正常にコードは動作しました。
使用中のUSBカメラはストレージとして使用できるタイプではないようです。
リンク先を拝見しましが,RegisterDeviceNotificationの使用方法がわかりませんでした...
>>それ以外のデバイスの場合は予め設定しておかないと...
上記の設定は具体的にどのようにすれば実現できますでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
都道府県穴埋めゲーム
都道府県の名前を1人1つずつ投稿してください。全ての都道府県が出たら締め切ります!
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
C++でUSBメモリが接続されたことを認識したい
C言語・C++・C#
-
DEVICECHANGE() の受け取り
C言語・C++・C#
-
リムーバブルディスクをPCへ挿入を監視したいのです
C言語・C++・C#
-
-
4
charからLPTSTRへの変換方法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンビニバイトでやらかしたか...
-
人が入れない床下の映像を撮りたい
-
教えてください! 普通に家とか...
-
バレずに動画をとる方法ってあ...
-
スカイプでカメラが認識されま...
-
変態ロリコンが女の子の写真を...
-
新しくノートPC(Dynabook)を購...
-
いじめの証拠を押さえる為の小...
-
防犯カメラで監視されてるみたい
-
坂道グループのミーグリについ...
-
携帯の外カメビデオで撮影した...
-
撮影と撮像の違い
-
LINEのカメラで撮影した動画に...
-
ビデオカメラが必要 レンタル...
-
スマホの動画撮影 10分くらい...
-
カールツァイスとライカのレン...
-
「連続撮影時間」と「実撮影時...
-
正確な撮影日時を知る方法は!?
-
日常を撮影したホームビデオの...
-
世界の果てまでイッテQで使われ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンビニバイトでやらかしたか...
-
新しくノートPC(Dynabook)を購...
-
アダルトビデオとかである、洋...
-
アナログカメラとIPカメラって...
-
防犯カメラで監視されてるみたい
-
ノートパソコンのカメラが作動...
-
ノートパソコンの内蔵カメラが...
-
隣人から盗撮されているかも
-
教えてください! 普通に家とか...
-
自転車で「普通の一眼カメラ」...
-
いじめの証拠を押さえる為の小...
-
今日、お母さんがリビングに設...
-
監視カメラをお店につけている...
-
ペットの見守りカメラを外出先...
-
skypeのビデオ通話がピンボケな...
-
盗聴器のようなカメラで。
-
ワイヤレス防犯カメラを両面テ...
-
ドライブレコーダーってHDRとWD...
-
おすすめ、または人気の一眼レ...
-
他人のパソコンなどのWEBカメラ...
おすすめ情報