2013年01月29日

デバイスを引っこ抜いたらWindowsをシャットダウンするアプリ

 また、どこに需要があるのか不明なアプリを作ってしまったが…。デバイス接続状態を検出してWindowsを制御するアプリである。
これ

【そもそもは】
 携帯で再生した音楽を、WindowsPCのBluetoothでA2DPで受けて、スピーカーから再生するようにする(先日のやつを車から出してきて、シームレスに使おうという肚である)。で、使うと、間違いなくWindowsのシャットダウンを忘れて電気を無駄遣いするのが容易に予想される。そこで、Bluetoothのデバイスを監視して特定のペアリングが切れたらシャットダウンを発行するアプリがあればいいんじゃないかろうかと思いつく。で、探してみたけどどうもなさそうなので、じゃあ手っ取り早く作るかと思って、コードを書き始めた。
 だが、Bluetoothは(自作に)よくない。
 Bluetoothのスタックが何種類も(Microsoftのと、東芝のと、WIDCOMMのと、BlueSolielのと。他にもあるのかもしれん)あって、それぞれAPIもSDKも別である。簡単に使えるのはMSの標準で付いてるスタックだが、MSスタックではA2DPが食えない。家のはWIDCOMMスタックを入れてA2DPを動かしたが、当然MSのAPIでは扱えない。いちいちSDKをゲットしてドキュメントを読んで、結局WIDCOMM専用のアプリにしかならないと思うと気力が萎えて、沙汰止みとした。
 
【思い直した】
 単にデバイスがあるかどうかが取りたいだけなのにになんでこんなに困難なんだと思っていたが、後日気がついた。
 Blutoothとかは関係なく、Windowsに接続されているデバイスを直接見れば何とかなるんじゃない?それだとBluetooth以外のデバイスにも対応できるし、その方が汎用じゃない?
 具体的には、SetupDiEnumDeviceInfoしてSetupDiGetDeviceRegistryPropertyして、さっきと今を比べたら、デバイス引っこ抜いたのが分かるんじゃない?

 と、いうわけで、ざくざくとアプリを作ってみた。
 特定のデバイスを引っこ抜いたり、接続したりした時に、それに反応して、シャットダウン/ログオフ/サスペンド/休止状態/パワーオフまたはユーザー定義アプリを実行する。
 定期的にデバイス一覧を取っては比較、デバイスのユニークネスは、SPDRP_CLASSGUIDSPDRP_HARDWAREIDの0番目で見る。従って、着脱時にデバイスマネージャーに出没して、HARDWAREIDがユニークなデバイスなら、使用可能のはずである。例えばUSBメモリースティックとかね。


 携帯をBluetoothをA2DPでペアリングすると、音量とかを操作するヤツがHIDデバイスで出没するので、こいつを捉えて初期の目標を達成した。他にどんな使い道があるのか分からないが、せっかく作ったので公開しておく。

ByDHalt デバイス接続状態を検出してWindowsを制御


 誰かの役に立てば幸い。

posted by usoinfo at 17:28 | Comment(1) | 開発 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
マウスとキーボードの操作を無効にした上で
シャットダウン、および自身のプロセスキルの無効化、設定変更をパスワードで指定可能にしたら、セキュリティ的にも結構なものが作れると思いますね。

(まあようするにUSBキーですねw
Posted by 通りすg at 2013年04月28日 15:09
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]