DOBON.NET DOBON.NETプログラミング掲示板過去ログ

専用USBメモリカートリッジの挿入を感知につきまして

環境/言語:[環境(Windows XP)、使用言語(VB6.0)]
分類:[VB6以前]

お世話になります。

専用USBメモリカートリッジの挿入を感知するプログラムにつきまして
USBハブに専用USBメモリカートリッジの挿入を感知しましたらデバイスインスタンス
ID(VID、PID)を照合して確認できればと願っています。
USBメモリカートリッジの挿入を感知し、それが専用USBメモリカートリッジか確認する
事は可能でしょうか。参考となるような事でもありましたら、ご授受を願えれば幸いです。
よろしくお願い致します。
> USBメモリカートリッジの挿入を感知し、それが専用USBメモリカートリッジか確認する
> 事は可能でしょうか。参考となるような事でもありましたら、ご授受を願えれば幸いです。

  以前、どこかの掲示板で書いたのですが・・・
  WndProcをオーバーライドして、MSG = WM_DEVICECHANGE (0x219) の場合に
  WParam = DBT_DEVICEARRIVAL (0x8000) なら、デバイスが増えた
       DBT_DEVICEREMOVECOMPLETE (0x8004) なら、デバイスが無くなった
  このイベントのタイミングで、USB関係APIでデバイスを調査すれば
  可能かと。

  全てのデバイスの増減でこのイベントが発生しますので、目的のデバイス
  かどうかは、ご自身で作って下さい。デバイス情報が解っているのが前提
  ですので、難しくはないかと。

以上。
追伸

ttp://www.codeproject.com/KB/system/usbeject.aspx

このプログラムなんか、そのものズバリではないですが、欲しい
情報を取得・表示させていますので、流用できるかと。

以上。
オショウ様
返答下さいましてありがとうございました。
>以前、どこかの掲示板で書いたのですが・・・
>・・・
>USB関係APIでデバイスを調査すれば可能かと。

以上のアドバイスは大変参考になりました。
何から調べたら良いのか分かりませんでしたが
お陰様で調べる切っ掛けを知る事ができました。
参考になりそうなVB6用のプログラムを色々探して調べてみたいと思います。
追伸までご授受して頂きまして本当にありがとうございました。
> 参考になりそうなVB6用のプログラムを色々探して調べてみたいと思います。

  もう少し調べてから投稿すればよかった・・・

  ttp://yaplog.jp/orator/archive/76

  簡易ながらVB6のサンプル見つけました。

参考までに。
オショウ様

返答下さいましてありがとうございました。
>ttp://yaplog.jp/orator/archive/76
VB6のサンプル見つけて頂きましてお礼を申し上げます。
マイ コンピュータ → 外付けのハードデスク、リムーバブル記憶域があるデバイスでは
デバイスの抜き差しによる追加、削除のドライブ番号は問題なく表示されました。
しかし専用USBメモリカートリッジには抜き差しても反応しませんでした。
説明不足で申し訳ありません。専用USBメモリカートリッジはマイ コンピュータには無く(ドライブ番号)
デバイスマネージャ → USBコントローラ → 専用USBメモリカートリッジにあります。
専用USBメモリカートリッジの抜き差しにより何か識別番号のようなものが確認できればと思っています。
VB6のサンプルでプログラムの追加又は変更によって専用USBメモリカートリッジでも
抜き差しにより追加、削除の表示ができるようにする事は可能でしょうか。
もし可能でご授受を願えれば幸いです。
> しかし専用USBメモリカートリッジには抜き差しても反応しませんでした。

  先の.NETでの方で捕捉できるのかどうか・・・
  WM_DEVICECHANGEが発生していない場合、別の方法での監視となります。

  WM_DEVICECHANGEが発生しないケースも機器によってはあるようで、そ
  言うケースの場合、タイマーで監視するコードも発見していましたが
  非常に難解でしたので・・・

  タイマーで、SetupAPIを使って、接続されているデバイス状況を取得
  し、欲しい機能の増減を取得して、USB関係APIでデバイス情報を取得
  して・・・と言う流れになろうかと。

  一般USBデバイスでは無いので、これ以上の助言は難しいかと。

  尚、VB6の場合、全てWin32 APIを呼び出して行わないといけない
  ので、最悪、できない場合もあります。C言語でActiveX作った方が
  実装は楽かと。

以上。
この方法なら可能かと・・・

ttp://www.activebasic.com/forum/viewtopic.php?p=9729

参考までに。

以上。
もうひとつ参考まで・・・

ttp://www.geocities.jp/p400w/144_usb/144_usb.html

※ USB関係詳細が書かれていましたので。

以上。
オショウ様

返答下さいましてお礼を申し上げます。

>WM_DEVICECHANGEが発生しないケースも機器によってはあるようで、そ
>言うケースの場合、タイマーで監視するコードも発見していましたが
>非常に難解でしたので・・・
以上につきましては大変優位な助言で、自分にとっては貴重な情報でした。
>ttp://www.activebasic.com/forum/viewtopic.php?p=9729
以上の方法に挑戦してみます。
何度にも渡りご授受して下さいまして感謝致します。
本当にありがとうございました。
オショウ様

返答下さいましてありがとうございました。

>もうひとつ参考まで・・・
>ttp://www.geocities.jp/p400w/144_usb/144_usb.html
>※ USB関係詳細が書かれていましたので。
以前に
ファームウェア エコーサーバーメインプログラムの解説
パソコン側 エコーサーバー メインプログラムの解説
のプログラムをVB6にコピー、貼り付けしましたがデバッグできませんでした。又”mikroBASIC”の記述がありましたので
VB6用のプログラムでないものと判断して途中で中断しました。
■No22951に返信(AS0907さんの記事)
>> ttp://yaplog.jp/orator/archive/76
(^^;

> しかし専用USBメモリカートリッジには抜き差しても反応しませんでした。
ふたつ確認させてください。

(1)どのようなデバイスなのかよく分からなかったのですが、やりたいことは
その専用機器の(PCへの)接続判断でしょうか。それとも、その専用機器に対する
メモリカートリッジの挿抜判断なのでしょうか。

(2) 反応しなかった、というのは、SysInfo の DeviceArrival イベントが発生しなかった
という意味でしょうか。それとも、イベントそのものは発生しているものの、
ドライブレターが無いために、先のサンプルでは検出できなかったという意味でしょうか。


> 専用USBメモリカートリッジの抜き差しにより何か識別番号のようなものが確認できればと思っています。
DeviceArrival イベント(あるいは WM_DEVICECHANGE) の通知が発生しないのであれば、
『WMI』経由で、何かしらの情報を得られないか試してみてください。
http://msdn.microsoft.com/en-us/library/aa389273.aspx
http://www.microsoft.com/japan/msdn/columns/scripting/scripting06112002.aspx

たとえば、Win32_USBControllerDevice クラスとか。
Dim device As Object
For Each device In GetObject("winmgmts:").InstancesOf("Win32_USBControllerDevice")
    Debug.Print "-----"
    Debug.Print device.Antecedent
    Debug.Print device.Dependent
Next


一方、DeviceArrival イベントが発生するのであれば、そこから何か
追加情報を得ることができるかも知れません。まずはデバイスタイプを
調べてみてください。DeviceArrival イベントの場合は、DeviceType 引数、
WM_DEVICECHANGE メッセージの場合は wparam がそれにあたります。
(OS の種類によって、異なるパラメータが返される可能性があります)

'=== 以下、Windows SDK v6.0 の DBT.H より ===
Const DBT_DEVTYP_OEM              As Long = &H0
Const DBT_DEVTYP_DEVNODE          As Long = &H1
Const DBT_DEVTYP_VOLUME           As Long = &H2
Const DBT_DEVTYP_PORT             As Long = &H3
Const DBT_DEVTYP_NET              As Long = &H4
Const DBT_DEVTYP_DEVICEINTERFACE  As Long = &H5
Const DBT_DEVTYP_HANDLE           As Long = &H6
Const DBT_DEVNODES_CHANGED        As Long = &H7      'ハードウェア構成が変更された
Const DBT_QUERYCHANGECONFIG       As Long = &H17
Const DBT_CONFIGCHANGED           As Long = &H18
Const DBT_CONFIGCHANGECANCELED    As Long = &H19
Const DBT_MONITORCHANGE           As Long = &H1B
Const DBT_SHELLLOGGEDON           As Long = &H20
Const DBT_CONFIGMGAPI32           As Long = &H22
Const DBT_VXDINITCOMPLETE         As Long = &H23
Const DBT_NO_DISK_SPACE           As Long = &H47
Const DBT_LOW_DISK_SPACE          As Long = &H48
Const DBT_CONFIGMGPRIVATE         As Long = &H7FFF
Const DBT_DEVICEARRIVAL           As Long = &H8000   'デバイスが追加された
Const DBT_DEVICEQUERYREMOVE       As Long = &H8001   'デバイスを削除する許可を求めてきた
Const DBT_DEVICEQUERYREMOVEFAILED As Long = &H8002   'デバイスの削除がキャンセルされた
Const DBT_DEVICEREMOVEPENDING     As Long = &H8003   'デバイスが削除されようとしている
Const DBT_DEVICEREMOVECOMPLETE    As Long = &H8004   'デバイスは削除された
Const DBT_DEVICETYPESPECIFIC      As Long = &H8005   'デバイス固有のイベント
Const DBT_CUSTOMEVENT             As Long = &H8006
Const DBT_VOLLOCKQUERYLOCK        As Long = &H8041
Const DBT_VOLLOCKLOCKTAKEN        As Long = &H8042
Const DBT_VOLLOCKLOCKFAILED       As Long = &H8043
Const DBT_VOLLOCKQUERYUNLOCK      As Long = &H8044
Const DBT_VOLLOCKLOCKRELEASED     As Long = &H8045
Const DBT_VOLLOCKUNLOCKFAILED     As Long = &H8046
Const DBT_VPOWERDAPI              As Long = &H8100
Const DBT_USERDEFINED             As Long = &HFFFF
魔界の仮面弁士 様

返答下さいましてありがとうございました。
ご授受をして下さいましてお礼を致します
ふたつの確認につきましてご報告致します。
(1)健康機器で測定したデータは専用USBメモリカートリッジに書き込んでいます。
専用USBメモリカートリッジをパソコンのUSBハブに挿入して専用USBメモリカートリッジであることが
確認できましたら手動起動でなくVBソフトにより専用のソフトを自動起動したいと思っています。

(2)反応しなかったことにつきまして
[VB6]USBメモリ等が接続されたことを知る方法 
http://yaplog.jp/orator/archive/76
全てのプログラムの所にブレークを設定し専用USBメモリカートリッジ挿抜時
にはブザー音はしますがブレークはされませんでしたのでサンプルでは検出できませんでした。
デバイスマネージャ → USB(Universal Serial Bus)コントローラ → USB ルート ハブ
USB 大容量記憶装置デバイス 汎用 USB ハブ と同じ所に専用USBメモリカートリッジ
の名前が挿入で表示され抜いて名前の表示が消えました。
詳細なご授受をして下さいまして感謝いたします。
>DeviceArrival イベント(あるいは WM_DEVICECHANGE) の通知が発生しないのであれば、
の以降についてはこれから試させてもらいます。
遅くなりまして大変申し訳ありませんでした。
魔界の仮面弁士 様

途中経過になりますが下記のご指導には大変驚きました。
長い間、本、インターネットで調べたりしましたが
VB6でしかも1行でUSBのVID、PIDが陳列されたのには今でも信じられません。

>たとえば、Win32_USBControllerDevice クラスとか。
>Dim device As Object
>For Each device In GetObject("winmgmts:").InstancesOf("Win32_USBControllerDevice")
> Debug.Print "-----"
> Debug.Print device.Antecedent
> Debug.Print device.Dependent
>Next

次は追加情報を試してみます。
本当にありがとうございました。
お陰様で解決する事とができました。

オショウ様
MSG = WM_DEVICECHANGE (0x219)'追加
以上のご授受がきっかけにUSBメモリカートリッジ挿入の感知が分かりました。
幾度に渡りサンプルなどを提供下さいましてありがとう御座いました。

魔界の仮面弁士様
>For Each device In GetObject("winmgmts:").InstancesOf("Win32_USBControllerDevice")
> ・
>Next
USBのVID、PIDを陳列することができました。ありがとう御座いました。

解決方法
WM_DEVICECHANGEによりUSBメモリカートリッジ挿入が感知されましたら
USBの陳列を起動して専用USBメモリカートリッジを検索しました。
InStr(device.Dependent, "USB\\VID_123&PID_4567\\1234567")'例
そして専用ソフトの起動することができる様になりました。

オショウ様、魔界の仮面弁士様には大変お世話になりました。
本当にありがとう御座いました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板