アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在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カメラの抜挿しを正常に検知できるでしょうか?

A 回答 (4件)

見直したハズですが、アホな誤字があったので訂正。



># 接続したUSB2.0 Cameraのプロパティ、詳細の「デバイカクラスGUID」の値。

「デバイス クラス GUID」です。
    • good
    • 1

というワケでやってみました。

(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で定義されているのだから…固定ですかねぇ。
# どのファイルをインクルードして使うのかはよくわかりませんでしたが。
    • good
    • 0

>上記の設定は具体的にどのようにすれば実現できますでしょうか?



具体的に…と問われても……
USB-Serial変換かせいぜいUSBメモリの場合しか試したことはありませんから、
USBカメラ(Webカメラ?)がどのようになるのかは不明です。

「RegisterDeviceNotification」で検索すると使い方とか説明しているページがいくつか見つかるはずですから、
そちらのサンプル等を参照して試行錯誤…でしょうかね。
# 接続するUSBカメラによっても対応が変わる可能性がありますし……。

一般的なUSBカメラ(UVC対応カメラ)の場合のGUIDでもあれば、あるいは一般化できるのかも知れませんが。
# 家に帰れば…UVC対応カメラがあったハズ(あきばお~で処分価格で売っていたモノを1つ買ったので)。
あとは…もしかしたらDDKも必要かも知れないですな。
# C++/CLIは不明。
    • good
    • 0

接続しているUSBカメラはストレージとして使えるタイプではない…ということでしょうか?


# デジカメなんかとUSB接続だとリムーバブルストレージとして見えたりしますが。

USB-Serial変換やUSB-Parallel変換、またはリムーバブルストレージ(カードリーダ系も含む。ドライブ名が割り当て可能なものですかね)ならば
特に設定しなくてもOSから通知が来ますが、それ以外のデバイスの場合は予め設定しておかないと通知の種類が少ない…のでしょう。
# USBなBluetoothドングルだと…シリアルポートとして反応するんだろうか……。

参考URL:http://social.msdn.microsoft.com/Forums/ja-JP/wi …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>>リムーバブルストレージならば特に設定しなくてもOSから通知が来ます...
上記をもとに,USBメモリーを抜挿しした場合は,正常にコードは動作しました。
使用中のUSBカメラはストレージとして使用できるタイプではないようです。

リンク先を拝見しましが,RegisterDeviceNotificationの使用方法がわかりませんでした...

>>それ以外のデバイスの場合は予め設定しておかないと...
上記の設定は具体的にどのようにすれば実現できますでしょうか?

お礼日時:2012/06/08 14:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!