Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
hook je mechanismus, pomocí kterého může aplikace zachytit události, jako jsou zprávy, akce myši a stisknutí kláves. Funkce, která zachycuje konkrétní typ události, se nazývá hook procedura. Procedura háku může reagovat na každou událost, kterou přijme, a pak událost upravit nebo zahodit.
Mezi způsoby použití háku patří:
- Monitorování zpráv pro účely ladění
- Poskytování podpory pro nahrávání a přehrávání maker
- Poskytnutí podpory pro klíč nápovědy (F1)
- Simulace vstupu myši a klávesnice
- Implementace počítačové trénovací aplikace (CBT)
Poznámka
Háky mají tendenci zpomalovat systém, protože zvyšují množství zpracování, které musí systém provádět pro každou zprávu. Háček byste měli nainstalovat pouze v případě potřeby a co nejdříve ho odebrat.
Tato část popisuje následující:
- hákové řetězy
- Postupy háků
- Typy háků
Háčkové řetězy
Systém podporuje mnoho různých typů háčků; každý typ poskytuje přístup k jinému aspektu jeho mechanismu zpracování zpráv. Aplikace může například pomocí háku WH_MOUSE monitorovat provoz zpráv myši.
Systém udržuje samostatný řetěz háku pro každý typ háku. řetěz háku je seznam ukazatelů na speciální, aplikací definované funkce zpětného volání, které se nazývají procedury háku. Když dojde ke zprávě, která je přidružená k určitému typu háku, systém předá zprávu jednotlivým procedurě háku odkazovaným v řetězu háku, jeden za druhým. Akce, kterou může funkce háku provést, závisí na typu příslušného háku. Postupy háku pro některé typy háků mohou monitorovat pouze zprávy; ostatní můžou upravovat zprávy nebo zastavit jejich průběh v řetězu, což jim brání v dosažení další procedury háku nebo cílového okna.
Procedury háku
Aby vývojář mohl využít určitý typ háku, poskytuje proceduru háku a pomocí funkce SetWindowsHookEx ji nainstaluje do řetězu přidruženého k háku. Procedura háku musí mít následující syntaxi:
LRESULT CALLBACK HookProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
// process event
...
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
HookProc je zástupný symbol pro název definovaný aplikací.
Parametr nCode je kód háku, který procedura háku používá k určení akce, která se má provést. Hodnota kódu háku závisí na typu háku; každý typ má vlastní charakteristickou sadu kódů háku. Hodnoty parametrů wParam a lParam závisí na kódu háku, ale obvykle obsahují informace o odeslané nebo publikované zprávě.
Funkce SetWindowsHookEx vždy nainstaluje proceduru háku na počátek řetězu háčků. Když dojde k události sledované určitým typem háku, vyvolá systém proceduru na začátku řetězce háků spojeného s tímto hákem. Každá procedura háku v řetězci určuje, zda se má událost předat další procedurě. Procedura háku předá událost dalšímu postupu voláním funkce CallNextHookEx.
Všimněte si, že procedury pro některé typy hooků můžou monitorovat pouze zprávy. Systém předává zprávy každé proceduře háku bez ohledu na to, zda konkrétní procedura volá CallNextHookEx.
Globální hák monitoruje zprávy pro všechna vlákna ve stejné pracovní ploše jako volající vlákno. Háček specifický pro vlákno monitoruje zprávy pouze pro jednotlivá vlákna. Globální proceduru hook lze volat v kontextu libovolné aplikace na stejném pracovním ploše jako volající vlákno, takže procedura musí být v samostatném modulu DLL. Procedura háku specifická pro vlákno je volána pouze v kontextu přidruženého vlákna. Pokud aplikace nainstaluje proceduru háku pro jedno z vlastních vláken, může být procedura háku buď ve stejném modulu jako zbytek kódu aplikace, nebo v knihovně DLL. Pokud aplikace nainstaluje proceduru háku pro vlákno jiné aplikace, musí být procedura v knihovně DLL. Pro informace viz Dynamic-Link knihovny.
Poznámka
Globální háky byste měli používat pouze pro účely ladění; jinak byste se jim měli vyhnout. Globální háky způsobují problémy s výkonem systému a způsobují konflikty s jinými aplikacemi, které implementují stejný typ globálního háku.
Typy háků
Každý typ háku umožňuje aplikaci monitorovat jiný aspekt mechanismu zpracování zpráv systému. Následující části popisují dostupné háky.
- WH_CALLWNDPROC a WH_CALLWNDPROCRET
- WH_CBT
- WH_DEBUG
- WH_FOREGROUNDIDLE
- WH_GETMESSAGE
- WH_JOURNALPLAYBACK
- WH_JOURNALRECORD
- WH_KEYBOARD_LL
- WH_KEYBOARD
- WH_MOUSE_LL
- WH_MOUSE
- WH_MSGFILTER a WH_SYSMSGFILTER
- WH_SHELL
WH_CALLWNDPROC a WH_CALLWNDPROCRET
Háky WH_CALLWNDPROC a WH_CALLWNDPROCRET umožňují monitorovat zprávy odeslané do procedur oken. Systém volá proceduru háku WH_CALLWNDPROC před předáním zprávy do procedury přijímajícího okna a zavolá proceduru háku WH_CALLWNDPROCRET poté, co procedura okna zpracuje zprávu.
Háček WH_CALLWNDPROCRET předá ukazatel na strukturu CWPRETSTRUCT do procedury háčku. Struktura obsahuje návratovou hodnotu z procedury okna, která zprávu zpracovala, a také parametry zprávy přidružené ke zprávě. Podtřídění okna nefunguje pro zprávy zasílané mezi procesy.
Další informace naleznete ve funkcích zpětného volání CallWndProc a CallWndRetProc.
WH_CBT
Systém volá proceduru WH_CBT háku před aktivací, vytvořením, zničením, minimalizací, maximalizací, přesunutím nebo určením velikosti okna; před dokončením systémového příkazu; před odebráním události myši nebo klávesnice z systémové fronty zpráv; před nastavením vstupního fokusu; nebo před synchronizací se systémovou frontou zpráv. Hodnota, kterou procedura háku vrátí, určuje, zda systém povoluje nebo brání některé z těchto operací. Háček WH_CBT je určen především pro počítačové trénování (CBT).
Další informace najdete v CBTProc funkce zpětného volání.
Pro informace se podívejte na WinEvents.
WH_DEBUG
Systém volá proceduru háku WH_DEBUG dříve, než volá procedury související s jakýmkoli jiným hákem v systému. Pomocí tohoto háku můžete určit, jestli má systém povolit volání procedur háku přidružených k jiným typům háku.
Další informace naleznete v DebugProc funkci zpětného volání.
WH_FOREGROUNDIDLE
Háček WH_FOREGROUNDIDLE umožňuje provádět úlohy s nízkou prioritou v době, kdy je vlákno popředí nečinné. Systém volá proceduru háčková WH_FOREGROUNDIDLE, když se vlákno aplikace v popředí chystá být nečinné.
Další informace najdete v ForegroundIdleProc funkce zpětného volání.
WH_GETMESSAGE
Háček WH_GETMESSAGE umožňuje aplikaci monitorovat zprávy, které mají být vráceny funkcí GetMessage nebo PeekMessage. Pomocí háku WH_GETMESSAGE můžete monitorovat vstup myši a klávesnice a další zprávy odeslané do fronty zpráv.
Další informace najdete ve funkci zpětného volání GetMsgProc.
WH_JOURNALPLAYBACK
Varování
API Hooks pro žurnálování nejsou od Windows 11 podporována a budou odstraněna v budoucím vydání. Z tohoto důvodu důrazně doporučujeme místo toho volat rozhraní API SendInput TextInput.
Háček WH_JOURNALPLAYBACK umožňuje aplikaci vkládat zprávy do systémové fronty zpráv. Pomocí tohoto háku můžete přehrát řadu událostí myši a klávesnice zaznamenaných dříve pomocí WH_JOURNALRECORD. Běžné zadávání myší a klávesnicí je zakázáno, pokud je nainstalován systémový háček WH_JOURNALPLAYBACK. Háček WH_JOURNALPLAYBACK je globální háček – nejde ho použít jako háček specifický pro vlákno.
Háček WH_JOURNALPLAYBACK vrátí hodnotu časového limitu. Tato hodnota říká systému, kolik milisekund má čekat před zpracováním aktuální zprávy z háku přehrávání. To umožňuje háku řídit načasování událostí, které se přehrávají.
Další informace najdete ve funkci zpětného volání JournalPlaybackProc.
WH_ZÁZNAMNÍKKNIHA
Varování
API Hooks pro žurnálování nejsou od Windows 11 podporována a budou odstraněna v budoucím vydání. Z tohoto důvodu důrazně doporučujeme místo toho volat rozhraní API SendInput TextInput.
Háček WH_JOURNALRECORD umožňuje monitorovat a zaznamenávat vstupní události. Obvykle pomocí tohoto háku zaznamenáte posloupnost událostí myši a klávesnice, které se budou později přehrávat pomocí WH_JOURNALPLAYBACK. WH_JOURNALRECORD háček je globální háček – nejde ho použít jako háček specifický pro vlákno.
Pro více informací se podívejte na JournalRecordProc callback funkce.
WH_KEYBOARD_LL
Háček WH_KEYBOARD_LL umožňuje monitorovat události vstupu klávesnice, které se mají publikovat ve vstupní frontě vlákna.
Další informace najdete v funkci zpětného volání LowLevelKeyboardProc.
WH_KEYBOARD
Háček WH_KEYBOARD umožňuje aplikaci sledovat tok zpráv pro WM_KEYDOWN a WM_KEYUP zprávy, které budou vráceny funkcí GetMessage nebo PeekMessage. Pomocí háku WH_KEYBOARD můžete monitorovat vstup klávesnice odeslaný do fronty zpráv.
Další informace najdete ve funkci zpětného volání KeyboardProc .
WH_MOUSE_LL
Háček WH_MOUSE_LL umožňuje monitorovat události vstupu myši, které se mají publikovat ve vstupní frontě vlákna.
Další informace naleznete v LowLevelMouseProc funkce zpětného volání.
WH_MOUSE
Háček WH_MOUSE umožňuje sledovat zprávy myši, které mají být vráceny funkcí GetMessage nebo PeekMessage. Pomocí háku WH_MOUSE můžete monitorovat vstup myši odeslaný do fronty zpráv.
Další informace najdete ve funkci zpětného volání MouseProc.
WH_MSGFILTER a WH_SYSMSGFILTER
Háky WH_MSGFILTER a WH_SYSMSGFILTER umožňují monitorovat zprávy, které se mají zpracovat pomocí nabídky, posuvníku, pole zprávy nebo dialogového okna a zjistit, kdy se má aktivovat jiné okno v důsledku stisknutí kombinace kláves ALT+TAB nebo ALT+ESC. Háček WH_MSGFILTER může monitorovat pouze zprávy, které jsou přesměrovány do menu, dialogového okna, posuvníku nebo okna zpráv vytvořených aplikací, která nainstalovala danou proceduru hooku. Háček WH_SYSMSGFILTER monitoruje takové zprávy pro všechny aplikace.
Háky WH_MSGFILTER a WH_SYSMSGFILTER umožňují provádět filtrování zpráv během modálních smyček, které jsou ekvivalentní filtrování provedenému ve smyčce hlavní zprávy. Aplikace například často zkoumá novou zprávu v hlavní smyčce mezi časem, kdy načte zprávu z fronty, a časem, kdy zprávu odešle, a podle potřeby provádí speciální zpracování. Během modální smyčky však systém načte a odesílá zprávy, aniž by aplikaci umožnilo filtrovat zprávy v hlavní smyčce zpráv. Pokud aplikace nainstaluje hákovou proceduru WH_MSGFILTER nebo WH_SYSMSGFILTER, systém ji volá během modální smyčky.
Aplikace může zavolat hák WH_MSGFILTER přímo voláním funkce CallMsgFilter. Pomocí této funkce může aplikace použít stejný kód k filtrování zpráv během modálních smyček, jak používá v hlavní smyčce zpráv. Uděláte to tak, že zapouzdříte operace filtrování v procedurě WH_MSGFILTER hook a zavoláte CallMsgFilter mezi voláními GetMessage a DispatchMessage funkcí.
while (GetMessage(&msg, (HWND) NULL, 0, 0))
{
if (!CallMsgFilter(&qmsg, 0))
DispatchMessage(&qmsg);
}
Poslední argument CallMsgFilter je jednoduše předán procedurě háku; můžete zadat libovolnou hodnotu. Definováním konstanty, například MSGF_MAINLOOP, může procedura háku použít tuto hodnotu k určení, odkud byla procedura volána.
Další informace najdete ve funkcích zpětného volání MessageProc a SysMsgProc.
WH_SHELL
Aplikace prostředí může k příjmu důležitých oznámení použít WH_SHELL hook. Systém volá proceduru háku WH_SHELL, když se chystá aktivovat aplikace shellu a když je vytvořeno nebo zrušeno okno nejvyšší úrovně.
Všimněte si, že vlastní shell aplikace nedostávají WH_SHELL zprávy. Proto musí každá aplikace, která se zaregistruje jako výchozí prostředí, zavolat funkci SystemParametersInfo, než bude moci přijímat zprávy WH_SHELL. Tato funkce musí být volána s SPI_SETMINIMIZEDMETRICS a strukturou MINIMIZEDMETRICS. Nastavte iArrange člen této struktury na ARW_HIDE.
Další informace najdete v ShellProc funkce zpětného volání.