Leap Motionアプリ/日記002
常駐アプリの作り方
Visual Studioの準備はできているので、商品の到着を待って、実際に開発してみることにしました。今回作ろうとしているのは、何か成果物を得るようなアプリではなく、アプリを管理するようなアプリです。ですから、イメージとしては、プロセスが常に走っていて、Leap Motionの動きを監視して、実行中にタスクトレイにアイコンが表示されるようなやつになります。今までそういう常駐アプリを作る機会がなかったので、WEB上で調べ物をしつつ作っていくことにします。
- 新しいプロジェクトを「Windowsアプリケーション」として作成
- Form1が勝手にできてくれる
- Program.csでウィンドウ(Form1)を呼び出すところを修正する。
//変更前
Application.Run(new Form1());
//変更後
Application.Run(); //引数にFormを渡さなければいいらしい
new Form1(); //渡さないけどnewはして、見えないけど動かす
- Form1にNotifyIconとContextMenuStripをツールボックスから追加する
- NotifyIcon1のVisibleをtrueにしてタスクトレイに表示するアイコンをIconに設定し、ContextMenuStripに一緒に追加したContextMenuStrip1を設定する
- ContextMenuStrip1に「終了」てきなメニューを追加してクリック時にアイコンを非表示にして、アプリを終了するようにする。
notifyIcon1.Visible = false;
Application.Exit();
これで常駐アプリの体裁が整いました。
Leap Motionのイベントリスニング
常駐アプリのやるべきことはLeap Motion自体の取り扱いと、Leap Motionから送られてくる数値信号の処理です。
private Listener listener;
private Controller controller;
Leap Motion本体の制御はControllerというクラスで行い、信号処理を行う部分はListenerというクラスで行うようです。標準のListenerは空なので、デバイスからの信号に対してなにも行いません。そのため実際にはListenerを継承したカスタムリスナを書くことになります。が、とりあえずからのリスナを登録してみます。
Form1がnewされた段階で、それぞれのクラスを初期化し、Controller.AddListenerでデバイスに信号のリスニングを行うクラスを渡します。
listener = new Listener();
controller = new Controller();
controller.AddListener(listener);
アプリが終了した段階で、デバイスに渡したリスナを破棄させます。
controller.RemoveListener(listener);
次回、カスタムリスナを書けば、このプログラムも完成する・・・はず。
(2013/8/5 追記)
Leap Motionから受け取った情報を元に処理を行いますが、デバッグ用にNotifyIconからバルーンチップを表示する機構を加えておこうと思います。NotifyIconのプロパティでバルーンチップのタイトルとテキストとアイコンがそれぞれ「BalloonTipTitle」「BalloonTipText」「BalloonTipIcon」に設定できます。タイトルは固定でアイコンはなしとし、テキストだけ動的に変更してバルーンチップを表示させるメソッドをForm1に加えます。
public void viewBalloon(string mes)
{
this.notifyIcon1.BalloonTipText = mes;
this.notifyIcon1.ShowBalloonTip(1000);
}
'Leap.LeapPINVOKE' のタイプ初期化子が例外をスローしました。
というエラーでプログラムが実行できない場合は、プログラムのバイナリファイルがある場所に「LeapSDK\lib\x64」の中のファイルを全部コピーすれば解決します。CPUによっては「LeapSDK\lib\x86」の方を使いましょう。