特集:正規表現によるテキストファイルパース:Visual Studio Magazine(4/8 ページ)
アプリ開発時における文字列扱いにはセンスが問われる。.NETにおける効率的なテキスト扱いのひとつ正規表現の技法。この特集では、開発時に役立つ具体例を挙げ、すぐにでも採り入れることが可能なテクニックを解説している。
グローバルなホットキーの検出
.NET開発者は、Windowsフォームアプリケーションが入力フォーカスを持っていない時であっても、与えられたキーの組み合わせが押されたかどうかを調べたいことがよくある。
そのような場合、キーが押されたかどうかを検出するために、2つの基本的な方法がある。どちらもWindows APIの呼び出しを必要とする。もっとも簡単な方法は、GetAsyncKeyState API関数を用いて、キーボードをポーリングする方法だ。
GetAsyncKeyState関数の宣言は、次のようになる。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
GetAsyncKeyState関数は、32ビットの引数をとる。値を取得したり変換して保存したりするときには、この引数に、Keys列挙体を利用できる。
GetAsyncKeyState関数を使うことは、かなり簡単だ。たとえば次のコードは、エンドユーザーが「Ctrl」+「A」キーの組み合わせでタイプしたかどうかを調査する。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このコードを、Intervalプロパティの値を十分に小さくした(たとえば200ミリ秒)TimerコントロールのTickイベントで動かせば、興味あるすべてのホットキーをトラップできるようになる。
しかしこのテクニックでは、Timerコントロールのインターバル間隔が短いと、アプリケーションにより多くのオーバーヘッドを加えてしまう。さらに、GetAsyncKeyStateのドキュメントによれば、Windows NT、2000、XPの時に、(1)カレントデスクトップがアクティブなデスクトップではない場合、(2)デスクトップの設定により、エンドユーザーが押したキーがバックグラウンドアプリケーションに知られないように保護されている。そして、アプリケーションがフォアグラウンド状態でない場合には「0」を返す可能性があると示されている。
そこで、オーバーヘッドを回避するため、RegisterHotKey API関数を使って、グローバルなホットキーを登録する方法をとろう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
hwndは、最後の2つの引数によって指定されたホットキーがエンドユーザーによって押されたとき、WM_HOTKEYメッセージを受け取るウィンドウのハンドルだ。
引数idは、ホットキーを区別する識別子であり、システムに登録されたそれぞれのグローバルキーと違ったものでなければならない。アプリケーションがシャットダウンする時には、登録したグローバルホットキー情報を解除するため、UnregisterHotKey API関数を呼び出す必要がある。
アプリケーションのメインフォームが読み込まれた場合にホットキーを登録し、サブクラスでホットキーをトラップし、フォームが閉じられた際にホットキーを解放するプログラムは、リスト2のようになる。
クラスのそれぞれのインスタンスに唯一無二のIDを作成するには、マイクロソフトのドキュメントで推奨されているように、GlobalAddAtom API関数を用いる。
幾つかのAPIを呼び、また、フォームのWndProcメソッドをオーバーライドすることで、入力フォーカスをもっていない時に、エンドユーザーが与えられたキーの組み合わせの通知を受けられるようにする。以下のコードをWindowsフォームクラスに追加しよう。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
上記、リスト2に示したコードには、フォームのクラス内部から呼び出された場合のみの動作という制限がある。
幾つかの状況では、コンポーネントのような非ビジュアルなクラス内からグローバルホットキーをトラップする必要があるかもしれない。このような用途のために、筆者はフォーム外からもトラップ可能な、GlobalHotKeyというスタンドアロンのクラスを作成した。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
© Copyright 2001-2005 Fawcette Technical Publications