全画面で動作するようなアプリケーションなどでは、[Win]、[Ctrl]+[ESC]、[ALT]+[TAB]、[ALT]+[ESC]、[Ctrl]+[Shift]+[ESC]、[ALT]+[F4]のようなWindowsのシステムキーコンビネーションを無効にしたいような状況があります。そのような場合はキーボードを低レベルフックします。フックの設定はSetWindowsHookEx(ja)で、解除はUnhookWindowsHookEx(ja)で行い、フック関数はLowLevelKeyboardProc(ja)に従って作成します。フック関数が呼び出されるときにlParamにはKBDLLHOOKSTRUCT構造体へのポインタが格納されており、この中のvkCodeで押されたキーの仮想キーコードを、flagsのLLKHF_ALTDOWNビット(bit5)で[ALT]キーが押されているかどうかを、それぞれ知ることができます。ここで無効化したいキーだった場合は戻値を1としてそのままリターンします。一方でそのままにしたいキーだった場合はCallNextHookEx(ja)で次のフックチェーンに処理を委ねる必要があります。また[ALT]以外のキー([Ctrl]や[Shift]など)とのコンビネーションを知りたい場合はGetAsyncKeyState(ja)で取得します(bit15が現在そのキーが押されているかどうかを示しています)。
まずキーボードの低レベルフックに必要な定義を行います。
次にフック関数を用意します。
ここでは集合型のInvalidCombinationsに含まれるキーコンビネーションであればResultを1にしてそのままリターン、そうでなければCallNextHookExでフックチェーンの呼び出しを行うようにしています。
最後にキーボードの低レベルフックを設定、解除する関数は
と単にSetWindowsHookExおよびUnhookWindowsHookExを呼び出すだけです。
なお[Ctrl]+[ALT]+[Del]のキーストロークだけはキーボードの低レベルフックでも捕捉できません(GINAの置き換えが必要になります)。
2010年7月23日
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿