現在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で質問しましょう!
似たような質問が見つかりました
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- その他(パソコン・周辺機器) Windowsマシン。USBタップの「自動切れ、再接続」がうざい。解決策は? 7 2023/01/25 08:27
- JavaScript jsで、switch文で書かれた分をif文にできませんか。 1 2022/07/28 15:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- ドライブ・ストレージ Windowsの絵柄が変わったので元に戻す方法を教えて下さい。 8 2023/02/27 17:31
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- Windows 10 Windows10でUSB機器が接続/抜去した際のログ確認について イベントビューアの「Driver 1 2022/07/12 16:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アダルトビデオとかである、洋...
-
コンビニバイトでやらかしたか...
-
AirPodsを貰ったのですが相手が...
-
EOS7のグリップがベタベタ...
-
いじめの証拠を押さえる為の小...
-
防犯カメラで監視されてるみたい
-
他人のパソコンなどのWEBカメラ...
-
ノートパソコンのカメラが作動...
-
IPカメラTENVISについて
-
「α7 II ILCE-7M2」はいつまで...
-
監視カメラをお店につけている...
-
こんなことってあるのでしょうか?
-
GoPro 12で撮影しているのです...
-
携帯の外カメビデオで撮影した...
-
Panasonic ビデオ HC-V360MS
-
ライカ D-LUX3とD-LUX4の違い
-
NoxplayerでMacBookの内蔵カメ...
-
ゴープロを冷却する道具につい...
-
youtubeに投稿したいのですがカ...
-
iPhone付属のイヤホンのマイク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コンビニバイトでやらかしたか...
-
アダルトビデオとかである、洋...
-
新しくノートPC(Dynabook)を購...
-
ノートパソコンのカメラが作動...
-
防犯カメラで監視されてるみたい
-
他人のパソコンなどのWEBカメラ...
-
ノートパソコンの内蔵カメラが...
-
教えてください! 普通に家とか...
-
隣人から盗撮されているかも
-
CyberLink YouCamというソフト...
-
監視カメラをお店につけている...
-
坂道グループのミーグリについ...
-
私も植物の成長をタイムラプス...
-
wndProcを用いたUSBデバイスの...
-
いじめの証拠を押さえる為の小...
-
zoomのカメラが検出できないの...
-
USBカメラ1台で他のPCより画像...
-
自動ブレーキに使われるカメラ...
-
ペットの見守りカメラを外出先...
-
自転車で「普通の一眼カメラ」...
おすすめ情報