通知領域に表示される文字列の取得

解決


xxxIKIO  2009-07-15 08:49:49  No: 142220

新規USB DeviceをPCへ接続したときに、通知領域に
「新しいハードウェアがインストールされ、使用準備が出来ました。」
と出ますが、これを取得する事は可能なのでしょうか?

USB Deviceを認識したのち、使用可能になるタイミングが
つかめなくて困っています。

ちなみに、作成するアプリは
  USBストレージデバイスが接続されたら、容量を取得し表示する
です。新しいハードウェアのインストール中は、何度も認識
(デバイスマネージャに出てー>消えてを繰り返す)為、インストールが
完了した上で容量の確認をしたいです。

申し訳ありませんが、御教授いただきたいと思いますので協力を
よろしくお願いします。


オショウ  2009-07-15 09:50:25  No: 142221

http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200907/09070016.txt

この内容は参考にならない?

で、WndProcに飛び込んできたメッセージで
wParam = DBT_DEVICEARRIVAL の場合
lParam が、デバイス情報のポインタなので
そこから辿ってドライブ名が取得できます。

そのドライブが準備完了したかについては、
CreateFileで成功するまで、ループさせて
待てばよいかと。(Sleep入れてネ!)

大抵はドライブ情報が確定しているので、
失敗することは無いのですが・・・

※  あくまでUSBメモリを前提にしています
    ので、いろいろなものを刺して、メモリの
    時のみ成功させようとすると、lParamの情
    報から該当するデバイスタイプのみで確認
    するようにフィルターしなければなりませ
    ん。

以上。


xxxIKIO  2009-07-15 17:32:37  No: 142222

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

CreateFile関数を使ってみたのですが、どうやら認識途中でも成功してしまうようです。

このあたりのソースを流用して確認しました。
http://www.winapi-database.com/Kimagure/No4/

動作としては、一度成功したのち失敗→成功した後に
「使用準備ができました」表示が出ました。
(もちろん、一度認識した後は、一度成功が出た後は
  変化しませんでした)

ドライブ情報が確定するのが、デバイス認識(DBT_DEVICEARRIVAL)
後からのようなので・・・・

他によい方法はないのでしょうか??
申し訳ありませんが、宜しくお願いします。


オショウ  2009-07-15 19:33:20  No: 142223

ドライブ情報が確定するタイミングは、当然、デバイス認識後
なのは当たり前・・・

ただ、そういう動作をするUSBストレージ
外付けHDDとかですか?

setupapi関連を使って、確実にデバイスの状態を監視・取得する
必要はあるみたいです・・・

デバイスのGUIDが特定されているなら、簡単かも・・・
WMIででもデバイスの監視を為されてみては?

※  DBT_DEVICEARRIVALを受信してからある一定時間待って
    尚、再度確認して存在すれば処理・・・と言う回避策
    しか無いような・・・

※  DBT_DEVICEARRIVAL=>DBT_DEVICEREMOVECOMPLETE が
    2回必ず来るなら、2回待つ。と言う方法でもよい
    かと・・・

以上。参考まで


xxxIKIO  2009-07-17 04:51:51  No: 142224

Setupapi関数ってなかなか検索しても情報ありませんね。。。。

通知領域に表示される以上、なんらか確認する方法があっても
おかしくないと思うのですが、、、、よくわかりませんね。

デバイスの認識時間は、PCSpecにも依存してしまうと思うので、
一定時間というのも難しいですが、いろいろと模索してみますね。

よい案があれば、教えていただきたいと思います。


オショウ  2009-07-17 06:09:41  No: 142225

とあるデバイスの検出に作った際のAPIですが・・・

SetupDiGetClassDevs
SetupDiEnumDeviceInterfaces
SetupDiOpenDeviceInfo
SetupDiGetDeviceInterfaceDetail
SetupDiGetDeviceRegistryProperty
SetupDiDestroyDeviceInfoList

機能的には、指定したドライブ(USBメモリ)のイジェクトです。
要は、安全な取り外しをAPIで実行させる機能です。

※  他にも当然API使ってますが、setupapi関連のみ列挙・・・

以上。参考まで


xxxIKIO  2009-07-24 04:42:34  No: 142226

SetupDI系を勉強してみますね。

わからないことがあれば、またあげたいと思います。

協力ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加