新規USB DeviceをPCへ接続したときに、通知領域に
「新しいハードウェアがインストールされ、使用準備が出来ました。」
と出ますが、これを取得する事は可能なのでしょうか?
USB Deviceを認識したのち、使用可能になるタイミングが
つかめなくて困っています。
ちなみに、作成するアプリは
USBストレージデバイスが接続されたら、容量を取得し表示する
です。新しいハードウェアのインストール中は、何度も認識
(デバイスマネージャに出てー>消えてを繰り返す)為、インストールが
完了した上で容量の確認をしたいです。
申し訳ありませんが、御教授いただきたいと思いますので協力を
よろしくお願いします。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200907/09070016.txt
この内容は参考にならない?
で、WndProcに飛び込んできたメッセージで
wParam = DBT_DEVICEARRIVAL の場合
lParam が、デバイス情報のポインタなので
そこから辿ってドライブ名が取得できます。
そのドライブが準備完了したかについては、
CreateFileで成功するまで、ループさせて
待てばよいかと。(Sleep入れてネ!)
大抵はドライブ情報が確定しているので、
失敗することは無いのですが・・・
※ あくまでUSBメモリを前提にしています
ので、いろいろなものを刺して、メモリの
時のみ成功させようとすると、lParamの情
報から該当するデバイスタイプのみで確認
するようにフィルターしなければなりませ
ん。
以上。
回答ありがとうございます。
CreateFile関数を使ってみたのですが、どうやら認識途中でも成功してしまうようです。
このあたりのソースを流用して確認しました。
http://www.winapi-database.com/Kimagure/No4/
動作としては、一度成功したのち失敗→成功した後に
「使用準備ができました」表示が出ました。
(もちろん、一度認識した後は、一度成功が出た後は
変化しませんでした)
ドライブ情報が確定するのが、デバイス認識(DBT_DEVICEARRIVAL)
後からのようなので・・・・
他によい方法はないのでしょうか??
申し訳ありませんが、宜しくお願いします。
ドライブ情報が確定するタイミングは、当然、デバイス認識後
なのは当たり前・・・
ただ、そういう動作をするUSBストレージ
外付けHDDとかですか?
setupapi関連を使って、確実にデバイスの状態を監視・取得する
必要はあるみたいです・・・
デバイスのGUIDが特定されているなら、簡単かも・・・
WMIででもデバイスの監視を為されてみては?
※ DBT_DEVICEARRIVALを受信してからある一定時間待って
尚、再度確認して存在すれば処理・・・と言う回避策
しか無いような・・・
※ DBT_DEVICEARRIVAL=>DBT_DEVICEREMOVECOMPLETE が
2回必ず来るなら、2回待つ。と言う方法でもよい
かと・・・
以上。参考まで
Setupapi関数ってなかなか検索しても情報ありませんね。。。。
通知領域に表示される以上、なんらか確認する方法があっても
おかしくないと思うのですが、、、、よくわかりませんね。
デバイスの認識時間は、PCSpecにも依存してしまうと思うので、
一定時間というのも難しいですが、いろいろと模索してみますね。
よい案があれば、教えていただきたいと思います。
とあるデバイスの検出に作った際のAPIですが・・・
SetupDiGetClassDevs
SetupDiEnumDeviceInterfaces
SetupDiOpenDeviceInfo
SetupDiGetDeviceInterfaceDetail
SetupDiGetDeviceRegistryProperty
SetupDiDestroyDeviceInfoList
機能的には、指定したドライブ(USBメモリ)のイジェクトです。
要は、安全な取り外しをAPIで実行させる機能です。
※ 他にも当然API使ってますが、setupapi関連のみ列挙・・・
以上。参考まで
SetupDI系を勉強してみますね。
わからないことがあれば、またあげたいと思います。
協力ありがとうございます。
ツイート | ![]() |