これ。
【そもそもは】
携帯で再生した音楽を、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_CLASSGUIDとSPDRP_HARDWAREIDの0番目で見る。従って、着脱時にデバイスマネージャーに出没して、HARDWAREIDがユニークなデバイスなら、使用可能のはずである。例えばUSBメモリースティックとかね。
携帯をBluetoothをA2DPでペアリングすると、音量とかを操作するヤツがHIDデバイスで出没するので、こいつを捉えて初期の目標を達成した。他にどんな使い道があるのか分からないが、せっかく作ったので公開しておく。
ByDHalt デバイス接続状態を検出してWindowsを制御
誰かの役に立てば幸い。
シャットダウン、および自身のプロセスキルの無効化、設定変更をパスワードで指定可能にしたら、セキュリティ的にも結構なものが作れると思いますね。
(まあようするにUSBキーですねw