|
Delphi Programming / Object Pascal

[掲載 2005年03月25日] [更新 2010年08月23日] Delphi 一般・その他 |
| フック関数の種類 |
| 動作確認等 |
サンプルプログラム集と Halbow 資料館以外のものは未確認 |
フック関数に関する解説は、Halbow 資料館にもありますが、フック関数を使用したサンプルをいくつか掲載していますので、どんなフック関数があるのか、そのいくつかの簡単な説明です。
これらのフック関数は、DLL 内でないと動作しないもの、どちらでもよいが、DLL 内と同じスレッド内に記述した場合とでは動作仕様が異なる等、また所定の動作や機能を実現するためには、メモリマップドファイルの使用が必要な場合もあります。このサンプルプログラム集は、解説が目的ではありませんので、詳細については、Windows API の資料などをご覧下さい。Windows 2000 以降ではいくつかのフック関数が追加されています。 |
以下のフック関数では、フック関数をインストール、有効にするには、SetWindowHookEx 関数を使用し、アンインストール、無効にするには、UnHookWindowsHookEx 関数を使用します。フック関数名そのものは任意です。ただし、フックのコールバック関数の引数の型と順番は決まっています。これは変更できません。
これらのフック関数のコールバック関数では、戻り値として、CallNextHookEx を呼び出すか、指定の値をセットしないと、他のプロセスにメッセージが届かないことになってしまいます。他のアプリケーションもフック関数を使用している場合があるということに留意する必要があります。
フックにはこの他、例えば、SetWinEventHook 関数でフックを開始し、UnhookWinEvent 関数でフックの解除を行うものもあります。 |
SendMessage によって呼出されるメッセージは、このフック関数を通過してから目的のウィンドウプロシージャーに送られるます。受取ったメッセージの変更はできませんが、あらゆる処理を行うことができます。ただし、処理は SendMessage 関数を呼出しているスレッドに関連づける必要があります。
このフックのコールバック関数内で処理を終了する場合は、戻り値として 0 をセットします。
以下にサンプルがあります。 |
SendMessage 関数で、目的のウィンドウプロシージャーに送られた後で、このフック関数を通過します。メッセージを変更することはできませんが、あらゆる処理を行うことができます。
ただし、SendMessage 関数を呼出しているスレッドに関連づけた処理に限ります。このフックのコールバック関数内で処理を終了する場合は、戻り値として 0 をセットします。
以下のリンクにサンプルがあります。 |
この関数は、ウィンドウのアクティブ化、作成、破棄、最小化、最大化、移動、サイズ変更の前、システムコマンドの終了前、キーボードの入力をウィンドウにセットする前、システムのメッセージキューからマウスまたは、キーボードメッセージを削除する前等にシステムから呼出されます。
このフックのコールバック関数の戻り値は、これらのイベントの発生を阻止するかどうかを決定します。この関数はシステムレベルのみで動作し、DLL 内におく必要があります。戻り値の値は、関係する操作によって異なることになります。
以下のリンクにサンプルがあります。 |
このフック関数は、他のフック関数をデバッグする時に使用します。システムは他のフック関数を呼出す前に、このフック関数を通過します。目的のフック関数を呼出したり、呼出をスキップすることもできます。
目的のフック関数の呼出を禁止するには、コールバック関数の戻り値に 0 以外の値を返します。またそれ以外の時は、CallNextHookEx からの戻り値を返す必要があります。 |
このフック関数は、GetMessage または PeekMessage 関数が呼出される前に呼出される関数です。メッセージのパラメータに変更を加えることができます。
Application.OnMessage に一番近いフック関数です。このフックのコールバック関数内で処理を終了する場合は、戻り値に 0 をセットします。 |
このフック関数の一般的な使い方は、WH_JOURNALRECORD フック関数によって既に記録されているマウスまたはキーボードメッセージを再生することです。[Ctrl] + [Esc] または [Ctrl] + [Alt] + [Del] キーを押すと、フック関数がアンインストールされて、アプリケーションに WM_CANCELJOURNAL メッセージをポストします。この関数がコールバック関数を呼出している間、マウスとキーボードは使用できなくなります。
[他のアプリケーションの操作を記録したい] ページにサンプルコードがあります。
このフック関数は Vista 以降の OS では最高の権限レベルが必要です。単に管理者権限に昇格するだけでは動作しません。詳細は MSDN の [ユーザーインターフェイス特権の分離 (UIPI)] の記事で確認してください。 |
このフック関数は主に、システムのメッセージキューから削除された (処理の終了した) メッセージを記録するのに使用されています。メッセージの修正はできません。このフックのコールバック関数は、[Ctrl] + [Break] の組合わせを押した時に発生する VK_CANCELL を監視し、発生した場合には、このフック関数をアンインストールする必要があります。これ以外はほとんどの処理が可能です。この関数からの戻り値は無視されます。
このフック関数は Vista 以降の OS では最高の権限レベルが必要です。単に管理者権限に昇格するだけでは動作しません。詳細は MSDN の [ユーザーインターフェイス特権の分離 (UIPI)] の記事で確認してください。 |
このフック関数は、アプリケーションが GetMessage または PeekMessage 関数を呼出して、キーボードメッセージを取得した時に呼出されます。この関数は任意の処理ができます。
キー操作を目的のウィンドウプロシージャーに送るのを禁止するには、コールバック関数の戻り値に 0 以外の値を返します。グローバルフックとして動作させるには、このフック関数を DLL 内に置く必要があります。
このフックを使用して、ワード操作フォームEx とエクセル操作フォームEx では、ショートカットキーを無効にする処理をしています。 |
このフック関数は、アプリケーションが GetMessage または PeekMessage 関数を呼出して、マウスメッセージを取得した時に呼出されます。この関数は任意の処理を行うことができます。
マウス操作を目的のウィンドウプロシージャーに送るのを禁止するには、コールバック関数の戻り値に 0 以外の値を返します。グローバルフックとして動作させるには、このフック関数を DLL 内に置く必要があります。 |
| ユーザが、ダイアログボックス、メッセージボックス、メニュー、スクロールバーに対する操作の際に生成されるメッセージを監視するのに使用します。目的のオブジェクトに送られる前にこのフック関数を通過し、あらゆる処理を実行することができます。このフック関数は、そのフックをインストールするスレッドのコード内に記述する必要があります。 |
シェルアプリケーションが、システムイベントを受取るのに使用されるフックです。ウィンドウのアクティブ化と作成を監視し、あらゆる処理ができます。
この関数のコールバック関数は、nCode の値が HSHELL_APPCOMMAND であり、WM_COMMAND メッセージを処理しない限り、戻り値は 0 とします。 |
| ユーザが、ダイアログボックス、メッセージボックス、メニュー、スクロールバーに対する操作を行った際、これらの中で入力イベントが発生すると、目的のウィンドウプロシージャーにメッセージが送られる前に、このフック関数のコールバック関数が呼出されます。このフック関数は DLL 内に存在する必要があります。WH_SHELL との違いは、この関数がシステム全体に適用されることです。 |
|