飴屋

Leap Motionアプリ/日記006

バックグラウンドでも動かしてみる

Leap Motionを使ってやりたかったことの一つが、Windows(OS)上でのウィンドウの管理です。狭い画面でいろんなウィンドウを開いて作業していると必要なウィンドウを最前面に持ってくる作業のコストが積み重なってバカにならない時間を無駄にしている気がします。そんな動機からタスクトレイにプログラムを常駐させて、常に指の動きを監視して指でウィンドウ達を操作する仕組みを作りました。しかし、ここで一つ問題が起こります。タスクトレイの中のプログラムにLeap Motionでいうところのフォーカスが当たらないのでした。

実験的に自作ListenerクラスのOnFocusGainedメソッドとOnFocusLostメソッドに仕掛けを施しておくとタスクトレイの中の当該アプリのアイコンを→クリックしてコンテキストメニューが出た段階でListenerはフォーカスを取得し、他のウィンドウをクリックするとすぐにListenerはフォーカスを失うことがわかりました。フォーカスを失っている間、ListenerのOnFrameメソッドが呼ばれることはなく、息をしていないも同然でした。常駐アプリからのウィンドウ管理の道に暗雲が垂れこみました。

いや、しかしLeap Motion Controllerはいわばマウスの仲間のようなデバイスです。フォーカスがなければ動かないなんてそんなわけないだろうと思ってAPIリファレンスを除いてみると、ControllerクラスにSetPolicyというメソッドを発見しました。LeapMotionの動作方針の設定を行うに違いありません。設定できるポリシーは二つありました。

Controller.PolicyFlag.POLICYDEFAULT
標準的なポリシー
Controller.PolicyFlag.POLICYBACKGROUNDFRAMES
アプリがバックグラウンド中でも反応しちゃうポリシー
controller = new Controller();
controller.SetPolicyFlags(Controller.PolicyFlag.POLICYBACKGROUNDFRAMES);

このポリシーを採用することで、無事にフォーカスがない状態でもLeapMotionのセンサーを動かすことに成功しました。

日記一覧