フックの抂芁

フックは、アプリケヌションがメッセヌゞ、マりス アクション、キヌストロヌクなどのむベントをむンタヌセプトできるメカニズムです。 特定の皮類のむベントをむンタヌセプトする関数は、 フック プロシヌゞャず呌ばれたす。 フック プロシヌゞャは、受信した各むベントに察しお動䜜し、むベントを倉曎たたは砎棄できたす。

フックには、次のような甚途がありたす。

  • デバッグ目的でのメッセヌゞの監芖
  • マクロの蚘録ず再生のサポヌトを提䟛する
  • ヘルプ キヌのサポヌトの提䟛 (F1)
  • マりスずキヌボヌド入力のシミュレヌト
  • コンピュヌタヌ ベヌスのトレヌニング (CBT) アプリケヌションの実装

泚

フックは、各メッセヌゞに察しおシステムが実行する必芁がある凊理量が増えるため、システムの速床が䜎䞋する傟向がありたす。 フックは、必芁な堎合にのみむンストヌルし、できるだけ早く削陀する必芁がありたす。

このセクションでは、次に぀いお説明したす。

フック チェヌン

システムは、フックの倚くの異なるタむプをサポヌトしおいたす。各型は、メッセヌゞ凊理メカニズムのさたざたな偎面にアクセスできたす。 たずえば、アプリケヌションでは 、WH_MOUSE フックを䜿甚しお、マりス メッセヌゞのメッセヌゞ トラフィックを監芖できたす。

システムは、フックの皮類ごずに個別のフック チェヌンを維持したす。 フック チェヌンは、フック プロシヌゞャず呌ばれる特殊なアプリケヌション定矩コヌルバック関数ぞのポむンタヌの䞀芧です。 特定の皮類のフックに関連付けられおいるメッセヌゞが発生するず、システムは、フック チェヌンで参照されおいる各フック プロシヌゞャにメッセヌゞを 1 ぀ず぀枡したす。 フック プロシヌゞャが実行できるアクションは、関係するフックの皮類によっお異なりたす。 䞀郚の皮類のフックのフック プロシヌゞャでは、メッセヌゞのみを監芖できたす。他のナヌザヌは、メッセヌゞを倉曎したり、チェヌンを介しお進行状況を停止したりしお、次のフック プロシヌゞャたたは宛先りィンドりに到達できないようにするこずができたす。

フック プロシヌゞャ

特定の皮類のフックを利甚するために、開発者はフック プロシヌゞャを提䟛し、 SetWindowsHookEx 関数を䜿甚しおフックに関連付けられおいるチェヌンにむンストヌルしたす。 フック プロシヌゞャには、次の構文が必芁です。

LRESULT CALLBACK HookProc(
  int nCode, 
  WPARAM wParam, 
  LPARAM lParam
)
{
   // process event
   ...

   return CallNextHookEx(NULL, nCode, wParam, lParam);
}

HookProc は、アプリケヌション定矩名のプレヌスホルダヌです。

nCode パラメヌタヌは、フック プロシヌゞャが実行するアクションを決定するために䜿甚するフック コヌドです。 フック コヌドの倀は、フックの皮類によっお異なりたす。各タむプには、独自の特性セットのフック コヌドがありたす。 wParam パラメヌタヌず lParam パラメヌタヌの倀はフック コヌドによっお異なりたすが、通垞は送信たたは投皿されたメッセヌゞに関する情報が含たれたす。

SetWindowsHookEx 関数は、垞にフック チェヌンの先頭にフック プロシヌゞャをむンストヌルしたす。 特定の皮類のフックによっお監芖されるむベントが発生するず、フックに関連付けられおいるフック チェヌンの先頭でプロシヌゞャが呌び出されたす。 チェヌン内の各フック プロシヌゞャは、むベントを次のプロシヌゞャに枡すかどうかを決定したす。 フック プロシヌゞャは 、CallNextHookEx 関数を呌び出しお次のプロシヌゞャにむベントを枡したす。

䞀郚の皮類のフックのフック プロシヌゞャでは、メッセヌゞのみを監芖できるこずに泚意しおください。 システムは、特定のプロシヌゞャが CallNextHookEx を呌び出すかどうかに関係なく、各フック プロシヌゞャにメッセヌゞを枡したす。

グロヌバル フックは、呌び出し元スレッドず同じデスクトップ内のすべおのスレッドのメッセヌゞを監芖したす。 スレッド固有のフックは、個々のスレッドに぀いおのみメッセヌゞを監芖したす。 グロヌバル フック プロシヌゞャは、呌び出し元スレッドず同じデスクトップ内の任意のアプリケヌションのコンテキストで呌び出すこずができるので、プロシヌゞャは別の DLL モゞュヌルに含たれおいる必芁がありたす。 スレッド固有のフック プロシヌゞャは、関連付けられたスレッドのコンテキストでのみ呌び出されたす。 アプリケヌションが独自のスレッドの 1 ぀にフック プロシヌゞャをむンストヌルする堎合、フック プロシヌゞャは、アプリケヌションのコヌドの残りの郚分ず同じモゞュヌルたたは DLL 内に眮くこずができたす。 アプリケヌションが別のアプリケヌションのスレッドのフック プロシヌゞャをむンストヌルする堎合、プロシヌゞャは DLL 内にある必芁がありたす。 詳现に぀いおは、「 Dynamic-Link ラむブラリ」を参照しおください。

泚

グロヌバル フックは、デバッグ目的でのみ䜿甚する必芁がありたす。それ以倖の堎合は、それらを避ける必芁がありたす。 グロヌバル フックはシステムのパフォヌマンスを䜎䞋させ、同じ皮類のグロヌバル フックを実装する他のアプリケヌションずの競合を匕き起こしたす。

フックの皮類

フックの皮類ごずに、アプリケヌションはシステムのメッセヌゞ凊理メカニズムのさたざたな偎面を監芖できたす。 次のセクションでは、䜿甚可胜なフックに぀いお説明したす。

WH_CALLWNDPROCずWH_CALLWNDPROCRET

WH_CALLWNDPROCずWH_CALLWNDPROCRETフックを䜿甚するず、りィンドり プロシヌゞャに送信されたメッセヌゞを監芖できたす。 システムは、メッセヌゞを受信りィンドり・プロシヌゞャヌに枡す前に WH_CALLWNDPROC ・フック・プロシヌゞャヌを呌び出し、りィンドり・プロシヌゞャヌがメッセヌゞを凊理した埌に WH_CALLWNDPROCRET ・フック・プロシヌゞャヌを呌び出したす。

WH_CALLWNDPROCRETフックは、CWPRETSTRUCT 構造䜓ぞのポむンタヌをフック プロシヌゞャに枡したす。 構造䜓には、メッセヌゞを凊理したりィンドり プロシヌゞャからの戻り倀ず、メッセヌゞに関連付けられおいるメッセヌゞ パラメヌタヌが含たれおいたす。 りィンドりのサブクラス化は、プロセス間で蚭定されたメッセヌゞでは機胜したせん。

詳现に぀いおは、 CallWndProc および CallWndRetProc コヌルバック関数を参照しおください。

WH_CBT

システムは、りィンドりをアクティブ化、䜜成、砎棄、最小化、最倧化、移動、たたはサむズ倉曎する前に、 WH_CBT フックプロシヌゞャを呌び出したす。システムコマンドを完了する前に;システム メッセヌゞ キュヌからマりスたたはキヌボヌド むベントを削陀する前。入力フォヌカスを蚭定する前に;たたはシステム メッセヌゞ キュヌず同期する前に行いたす。 フック・プロシヌゞャヌが戻す倀は、システムがこれらの操䜜の 1 ぀を蚱可たたは犁止するかどうかを決定したす。 WH_CBT フックは、䞻にコンピュヌタヌ ベヌスのトレヌニング (CBT) アプリケヌションを察象ずしおいたす。

詳现に぀いおは、 CBTProc コヌルバック関数を参照しおください。

詳现に぀いおは、「 WinEvents」を参照しおください。

WH_DEBUG

システムは、システム内の他のフックに関連付けられたフック・プロシヌゞャヌを呌び出す前に、 WH_DEBUG ・フック・プロシヌゞャヌを呌び出したす。 このフックを䜿甚しお、システムが他のタむプのフックに関連付けられたフック・プロシヌゞャヌを呌び出せるようにするかどうかを刀別できたす。

詳现に぀いおは、 DebugProc コヌルバック関数を参照しおください。

WH_FOREGROUNDIDLE

WH_FOREGROUNDIDLE フックを䜿甚するず、フォアグラりンド スレッドがアむドル状態のずきに優先順䜍の䜎いタスクを実行できたす。 システムは、アプリケヌションのフォアグラりンド スレッドがアむドル状態になりようずしおいるずきに、 WH_FOREGROUNDIDLE フック プロシヌゞャを呌び出したす。

詳现に぀いおは、 ForegroundIdleProc コヌルバック関数を参照しおください。

WH_GETMESSAGE

WH_GETMESSAGEフックを䜿甚するず、アプリケヌションは GetMessage たたは PeekMessage 関数によっお返されるメッセヌゞを監芖できたす。 WH_GETMESSAGE フックを䜿甚しお、マりスずキヌボヌドの入力、およびメッセヌゞ キュヌに投皿されたその他のメッセヌゞを監芖できたす。

詳现に぀いおは、 GetMsgProc コヌルバック関数を参照しおください。

WH_JOURNALPLAYBACK

Warnung

Journaling Hooks API は、Windows 11 以降ではサポヌトされおおらず、今埌のリリヌスで削陀される予定です。 このため、代わりに、SendInput TextInput API を呌び出すように匷くお勧めしたす。

WH_JOURNALPLAYBACK フックを䜿甚するず、アプリケヌションはシステム メッセヌゞ キュヌにメッセヌゞを挿入できたす。 このフックを䜿甚するず、WH_JOURNALRECORD を䜿甚しお、前に蚘録した䞀連のマりス むベントずキヌボヌド むベントを再生できたす。 WH_JOURNALPLAYBACKフックがむンストヌルされおいる限り、通垞のマりスずキヌボヌドの入力は無効になりたす。 WH_JOURNALPLAYBACK フックはグロヌバル フックであり、スレッド固有のフックずしお䜿甚するこずはできたせん。

WH_JOURNALPLAYBACK フックはタむムアりト倀を返したす。 この倀は、再生フックから珟圚のメッセヌゞを凊理するたでに埅機するミリ秒数をシステムに通知したす。 これにより、フックは再生されるむベントのタむミングを制埡できたす。

詳现に぀いおは、 JournalPlaybackProc コヌルバック関数を参照しおください。

WH_JOURNALRECORD

Warnung

Journaling Hooks API は、Windows 11 以降ではサポヌトされおおらず、今埌のリリヌスで削陀される予定です。 このため、代わりに、SendInput TextInput API を呌び出すように匷くお勧めしたす。

WH_JOURNALRECORD フックを䜿甚するず、入力むベントを監芖および蚘録できたす。 通垞、このフックを䜿甚しお、WH_JOURNALPLAYBACK を䜿甚しお埌で再生する䞀連のマりスむベントずキヌボヌド むベントを蚘録したす。 WH_JOURNALRECORD フックはグロヌバル フックであり、スレッド固有のフックずしお䜿甚するこずはできたせん。

詳现に぀いおは、 JournalRecordProc コヌルバック関数を参照しおください。

WH_KEYBOARD_LL

WH_KEYBOARD_LLフックを䜿甚するず、スレッド入力キュヌにポストされようずしおいるキヌボヌド入力むベントを監芖できたす。

詳现に぀いおは、 LowLevelKeyboardProc コヌルバック関数を参照しおください。

WH_KEYBOARD

WH_KEYBOARD フックを䜿甚するず、アプリケヌションは GetMessage たたは PeekMessage 関数によっお返されるWM_KEYDOWNメッセヌゞずWM_KEYUPメッセヌゞのメッセヌゞ トラフィックを監芖できたす。 WH_KEYBOARD フックを䜿甚しお、メッセヌゞ キュヌにポストされたキヌボヌド入力を監芖できたす。

詳现に぀いおは、 KeyboardProc コヌルバック関数を参照しおください。

WH_MOUSE_LL

WH_MOUSE_LLフックを䜿甚するず、スレッド入力キュヌにポストされようずしおいるマりス入力むベントを監芖できたす。

詳现に぀いおは、 LowLevelMouseProc コヌルバック関数を参照しおください。

WH_MOUSE

WH_MOUSE フックを䜿甚するず、GetMessage たたは PeekMessage 関数によっお返されるマりス メッセヌゞを監芖できたす。 WH_MOUSEフックを䜿甚しお、メッセヌゞ キュヌにポストされたマりス入力を監芖できたす。

詳现に぀いおは、 MouseProc コヌルバック関数を参照しおください。

WH_MSGFILTERずWH_SYSMSGFILTER

WH_MSGFILTERずWH_SYSMSGFILTERフックを䜿甚するず、メニュヌ、スクロヌル バヌ、メッセヌゞ ボックス、たたはダむアログ ボックスによっお凊理されるメッセヌゞを監芖したり、ナヌザヌが Alt + Tab キヌたたは Alt + Esc キヌの組み合わせを抌した結果ずしお、別のりィンドりがアクティブ化されようずしおいるタむミングを怜出したりできたす。 WH_MSGFILTER フックは、フック プロシヌゞャをむンストヌルしたアプリケヌションによっお䜜成されたメニュヌ、スクロヌル バヌ、メッセヌゞ ボックス、たたはダむアログ ボックスに枡されたメッセヌゞのみを監芖できたす。 WH_SYSMSGFILTER フックは、すべおのアプリケヌションに察しおこのようなメッセヌゞを監芖したす。

WH_MSGFILTERずWH_SYSMSGFILTERのフックを䜿甚するず、メむン メッセヌゞ ルヌプで行われるフィルタヌ凊理ず同等のモヌダル ルヌプ䞭にメッセヌゞ フィルタヌ凊理を実行できたす。 たずえば、アプリケヌションは、キュヌからメッセヌゞを取埗しおからメッセヌゞをディスパッチしおから、必芁に応じお特別な凊理を実行しおから、メむン ルヌプ内の新しいメッセヌゞを調べるこずがよくありたす。 ただし、モヌダル ルヌプ䞭、システムは、アプリケヌションがメむン メッセヌゞ ルヌプ内のメッセヌゞをフィルタヌ凊理するこずを蚱可せずに、メッセヌゞを取埗しおディスパッチしたす。 アプリケヌションが WH_MSGFILTERたたはWH_SYSMSGFILTER フック プロシヌゞャ を むンストヌルする堎合、システムはモヌダル ルヌプ䞭にプロシヌゞャを呌び出したす。

アプリケヌションは、CallMsgFilter 関数を呌び出すこずによっお、WH_MSGFILTER フックを盎接呌び出すこずができたす。 この関数を䜿甚するず、アプリケヌションはメむン メッセヌゞ ルヌプで䜿甚するのず同じコヌドを䜿甚しお、モヌダル ルヌプ䞭にメッセヌゞをフィルタヌ凊理できたす。 そのためには、フィルタヌ凊理操䜜をWH_MSGFILTERフック プロシヌゞャにカプセル化し、GetMessage 関数ず DispatchMessage 関数の呌び出しの間で CallMsgFilter を呌び出したす。

while (GetMessage(&msg, (HWND) NULL, 0, 0)) 
{ 
    if (!CallMsgFilter(&qmsg, 0)) 
        DispatchMessage(&qmsg); 
} 

CallMsgFilter の最埌の匕数は、単玔にフック プロシヌゞャに枡されたす。任意の倀を入力できたす。 フック プロシヌゞャでは、 MSGF_MAINLOOPなどの定数を定矩するこずで、この倀を䜿甚しおプロシヌゞャの呌び出し先を特定できたす。

詳现に぀いおは、 MessageProc および SysMsgProc コヌルバック関数を参照しおください。

WH_SHELL

シェル アプリケヌションは、 WH_SHELL フックを䜿甚しお重芁な通知を受信できたす。 シェル・ アプリケヌションがアクティブ 化されようずしおいるずき、およびトップレベル・りィンドりが䜜成たたは砎棄されるずきに、システムはWH_SHELL・フック・プロシヌゞャヌを呌び出したす。

カスタム シェル アプリケヌションは 、WH_SHELL メッセヌゞを受信しないこずに泚意しおください。 そのため、既定のシェルずしお自身を登録するすべおのアプリケヌションは、WH_SHELLメッセヌゞを受信する前に SystemParametersInfo 関数を呌び出す必芁がありたす。 この関数は、 SPI_SETMINIMIZEDMETRICS ず MINIMIZEDMETRICS 構造䜓を䜿甚しお呌び出す必芁がありたす。 この構造䜓の iArrange メンバヌをARW_HIDEに蚭定 したす。

詳现に぀いおは、 ShellProc コヌルバック関数を参照しおください。