A horgok áttekintése
A horog egy olyan mechanizmus, amellyel egy alkalmazás elfoghatja az eseményeket, például üzeneteket, egérműveleteket és billentyűleütéseket. Egy adott eseménytípust elfogó függvényt horog eljárásnak nevezünk. A horog eljárás minden kapott eseményre reagálhat, és azt módosíthatja vagy elvetheti.
Az alábbiakban néhány példa a horgok használatára:
- Üzenetek figyelése hibakeresés céljából
- Támogatás biztosítása makrók rögzítéséhez és lejátszásához
- Súgókulcs (F1) támogatása
- Egér- és billentyűzetbemenet szimulálása
- Számítógépes betanítási (CBT) alkalmazás implementálása
Jegyzet
A horgok általában lelassítják a rendszert, mert növelik a rendszer által az egyes üzenetek feldolgozásának mennyiségét. Csak akkor telepítse a horgot, ha szükséges, és távolítsa el a lehető leghamarabb.
Ez a szakasz a következőket ismerteti:
Horogláncok
A rendszer számos különböző típusú horgot támogat; minden típus hozzáférést biztosít az üzenetkezelési mechanizmus egy másik aspektusához. Egy alkalmazás például a WH_MOUSE hook segítségével figyelheti az egérrel kapcsolatos üzenetforgalmat.
A rendszer minden horogtípushoz külön horogláncot tart fenn. A horoglánc a speciális, alkalmazás által definiált visszahívási függvényekre mutató, horog eljárásokmutatóinak listája. Amikor egy adott típusú horoghoz kapcsolódó üzenet jelenik meg, a rendszer átadja az üzenetet a horogláncban hivatkozott minden egyes horog eljárásnak, egymás után. Az, hogy egy horgolási eljárás milyen műveletet hajthat végre, az érintett horog típusától függ. Bizonyos típusú horogeljárások csak figyelemmel kísérhetik az üzeneteket; mások módosíthatják az üzeneteket, vagy megállíthatják a láncon való áthaladásukat, megakadályozva, hogy elérjék a következő horogeljárást vagy a célablakot.
Hook műveletek
Egy adott típusú hook kihasználásához a fejlesztő egy hook eljárást definiál, és a SetWindowsHookEx függvénnyel telepíti a hookkal társított láncban. A horogműveletnek a következő szintaxissal kell rendelkeznie:
LRESULT CALLBACK HookProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
// process event
...
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
HookProc egy alkalmazás által definiált név helyőrzője.
Az nCode paraméter egy horogkód, amelyet a horog eljárás a végrehajtandó művelet meghatározására használ. A horogkód értéke a horog típusától függ; mindegyik típus saját jellegzetes horogkódkészlettel rendelkezik. A wParam és lParam paraméterek értéke a horogkódtól függ, de általában egy elküldött vagy közzétett üzenetről tartalmaznak információkat.
A SetWindowsHookEx függvény mindig a horoglánc elejére telepít egy hook eljárást. Amikor egy esemény történik, amelyet egy adott típusú hook figyel, a rendszer meghívja az eljárást a hookhoz társított hooklánc elején. A lánc minden egyes horog eljárása meghatározza, hogy az eseményt át kell-e adni a következő eljárásnak. A horog eljárás az eseményt a következő eljárásra továbbítja a CallNextHookEx függvény meghívásával.
Vegye figyelembe, hogy bizonyos típusú horgok esetében a horogra kapcsolódó eljárások csak üzeneteket figyelhetnek. a rendszer üzeneteket továbbít minden egyes horog eljárásnak, függetlenül attól, hogy egy adott eljárás meghívja-e CallNextHookEx.
A globális horog figyeli az összes szál üzeneteit ugyanabban az asztalon, mint a hívószál. A szálspecifikus horog csak egy adott szál üzeneteit figyeli. A globális horog eljárás meghívható bármely alkalmazás környezetében, ugyanabban az asztalon, mint a hívó szál, így az eljárásnak egy külön DLL-modulban kell lennie. A szálspecifikus horog eljárást csak a társított szál kontextusában hívjuk meg. Ha egy alkalmazás egy saját szálhoz telepíti a horog eljárást, a horog eljárás lehet ugyanabban a modulban, mint az alkalmazás kódjának többi része, vagy egy DLL-ben. Ha az alkalmazás horog eljárást telepít egy másik alkalmazás szálához, az eljárásnak DLL-ben kell lennie. További információ: Dynamic-Link Könyvtárak.
Jegyzet
Globális horgokat csak hibakeresési célokra érdemes használni; ellenkező esetben kerülnie kell őket. A globális horgok rontják a rendszer teljesítményét, és ütközéseket okoznak más alkalmazásokkal, amelyek ugyanazt a típusú globális horogot implementálják.
Horogtípusok
Az egyes horogtípusok lehetővé teszik az alkalmazások számára, hogy a rendszer üzenetkezelési mechanizmusának egy másik aspektusát monitorozzák. A következő szakaszok a rendelkezésre álló horgokat ismertetik.
- WH_CALLWNDPROC és 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 és WH_SYSMSGFILTER
- WH_SHELL
WH_CALLWNDPROC és WH_CALLWNDPROCRET
A WH_CALLWNDPROC és WH_CALLWNDPROCRET horgokkal figyelheti az ablakeljárásokra küldött üzeneteket. A rendszer meghív egy WH_CALLWNDPROC horog eljárást, mielőtt továbbítanák az üzenetet a fogadó ablak eljárásának, és meghívja a WH_CALLWNDPROCRET horog eljárást, miután az ablak eljárás feldolgozta az üzenetet.
A WH_CALLWNDPROCRET horog egy CWPRETSTRUCT szerkezetre mutató mutatót ad át a horog eljárásnak. A struktúra tartalmazza az üzenetet feldolgozó ablakművelet visszatérési értékét, valamint az üzenethez társított üzenetparamétereket. Az ablak alosztályozása nem működik a folyamatok között beállított üzeneteknél.
További információ: CallWndProc és CallWndRetProc visszahívási függvények.
WH_CBT
A rendszer WH_CBT horog eljárást hív meg egy ablak aktiválása, létrehozása, megsemmisítése, minimalizálása, maximalizálása, mozgatása vagy méretezése előtt; rendszerparancs végrehajtása előtt; mielőtt eltávolítaná az egér- vagy billentyűzeteseményt a rendszer üzenetsorából; a bemeneti fókusz beállítása előtt; vagy a rendszerüzenet-üzenetsorsal való szinkronizálás előtt. A horog eljárás által visszaadott érték határozza meg, hogy a rendszer engedélyezi vagy megakadályozza-e ezen műveletek egyikét. A WH_CBT horog elsősorban számítógépes betanítási (CBT) alkalmazásokhoz készült.
További információkért lásd a CBTProc visszahívási függvényt.
További információ: WinEvents.
WH_DEBUG
A rendszer meghív egy WH_DEBUG horog eljárást, mielőtt meghívja a rendszer bármely más horogához társított horog eljárásokat. Ezzel a hookkal meghatározhatja, hogy engedélyezi-e a rendszernek a többi hook típushoz társított eljárások meghívását.
A további információkért tekintse meg a DebugProc visszahívási függvényt.
WH_FOREGROUNDIDLE
A WH_FOREGROUNDIDLE horog lehetővé teszi, hogy alacsony prioritású feladatokat hajtsunk végre, amikor az előtérszál tétlenségi állapotban van. A rendszer meghív egy WH_FOREGROUNDIDLE horogfüggvényt, amikor az alkalmazás előtérszála hamarosan tétlenné válik.
További információ: ForegroundIdleProc visszahívási függvény.
WH_GETMESSAGE
A WH_GETMESSAGE horog lehetővé teszi, hogy az alkalmazás figyelje az GetMessage vagy PeekMessage függvény által visszaadott üzeneteket. A WH_GETMESSAGE horoggal figyelheti az egér- és billentyűzetbemenetet, valamint az üzenetsorba küldött egyéb üzeneteket.
További információért lásd a GetMsgProc visszahívási függvényt.
WH_JOURNALPLAYBACK
Figyelmeztetés
A Naplózási hookok API-k a Windows 11-től kezdve nem támogatottak, és egy későbbi kiadásban el lesznek távolítva. Emiatt javasoljuk, hogy inkább a SendInput TextInput API-t hívja meg.
A WH_JOURNALPLAYBACK horog lehetővé teszi, hogy az alkalmazás üzeneteket szúrjon be a rendszer üzenetsorába. Ezzel a horoggal lejátszhatja a korábban rögzített egér- és billentyűzetesemények sorozatát WH_JOURNALRECORDhasználatával. A normál egér- és billentyűzetbemenet mindaddig le van tiltva, amíg egy WH_JOURNALPLAYBACK horog van telepítve. A WH_JOURNALPLAYBACK horog egy globális horog – nem használható szálspecifikus horogként.
A WH_JOURNALPLAYBACK horog időtúllépési értéket ad vissza. Ez az érték azt jelzi a rendszernek, hogy hány ezredmásodpercig kell várnia, mielőtt feldolgozta az aktuális üzenetet a lejátszási horogból. Ez lehetővé teszi, hogy a horog szabályozza a visszajátszandó események időzítését.
További információért lásd a JournalPlaybackProc visszahívási függvényt.
WH_JOURNALRECORD
Figyelmeztetés
A Naplózási hookok API-k a Windows 11-től kezdve nem támogatottak, és egy későbbi kiadásban el lesznek távolítva. Emiatt javasoljuk, hogy inkább a SendInput TextInput API-t hívja meg.
A WH_JOURNALRECORD horog lehetővé teszi a bemeneti események monitorozását és rögzítését. Ez a hook általában az egér- és billentyűzetesemények sorozatának rögzítésére használható, hogy később a WH_JOURNALPLAYBACKhasználatával lejátszható legyen. A WH_JOURNALRECORD horog egy globális horog – nem használható szálspecifikus horogként.
További információért lásd a JournalRecordProc visszahívási függvényt.
WH_KEYBOARD_LL
A WH_KEYBOARD_LL horog lehetővé teszi, hogy figyelemmel kísérje a billentyűzet beviteli eseményeit, amelyek egy szál bemeneti sorába kerülnek.
A LowLevelKeyboardProc visszahívási függvényről további információt talál.
WH_KEYBOARD
A WH_KEYBOARD horog lehetővé teszi, hogy az alkalmazás figyelje az üzenetek forgalmát a WM_KEYDOWN és WM_KEYUP üzeneteknek, amelyek visszaadás előtt állnak a GetMessage vagy PeekMessage függvény által. A WH_KEYBOARD horoggal figyelheti az üzenetsorba küldött billentyűzetbemenetet.
A további információkért lásd a KeyboardProc visszahívási függvényt.
WH_MOUSE_LL
A WH_MOUSE_LL horog lehetővé teszi az egér inputeseményeinek figyelését, amelyek egy szál üzenetsorába kerülnek bejegyzésre.
További információ: LowLevelMouseProc visszahívási függvény.
WH_MOUSE
A WH_MOUSE horog lehetővé teszi a GetMessage vagy PeekMessage függvény által visszaadni kívánt egérüzenetek monitorozását. A WH_MOUSE horoggal figyelheti az üzenetsorba küldött egérbemenetet.
A(z) MouseProc visszahívási függvénnyel kapcsolatban további információért lásd.
WH_MSGFILTER és WH_SYSMSGFILTER
A WH_MSGFILTER és a WH_SYSMSGFILTER horgokkal figyelheti a menü, görgetősáv, üzenetmező vagy párbeszédpanel által feldolgozandó üzeneteket, és észlelheti, hogy a felhasználó az ALT+TAB vagy AZ ALT+ESC billentyűkombináció lenyomásával mikor aktiválódik egy másik ablak. A WH_MSGFILTER horog csak a horog eljárást telepítő alkalmazás által létrehozott menübe, görgetősávba, üzenetmezőbe vagy párbeszédpanelbe továbbított üzeneteket figyelheti. A WH_SYSMSGFILTER horog minden alkalmazás esetében figyeli az ilyen üzeneteket.
A WH_MSGFILTER és WH_SYSMSGFILTER horgok lehetővé teszik az üzenetek szűrését a fő üzenethurkban végzett szűrésnek megfelelő modális hurkok során. Egy alkalmazás például gyakran megvizsgál egy új üzenetet a fő hurokban az üzenetsorból való lekérése és az üzenet elküldésének időpontja között, és szükség szerint speciális feldolgozást végez. A modális ciklusok során azonban a rendszer anélkül kéri le és küldi el az üzeneteket, hogy lehetővé tenné az alkalmazás számára az üzenetek szűrését a fő üzenethurkában. Ha egy alkalmazás telepít egy WH_MSGFILTER vagy egy WH_SYSMSGFILTER hook eljárást, a rendszer meghívja ezt az eljárást a modális ciklus során.
Egy alkalmazás közvetlenül meghívhatja a WH_MSGFILTER horgot a CallMsgFilter függvény meghívásával. A függvény használatával az alkalmazás ugyanazt a kódot használhatja az üzenetek szűrésére a modális hurkok során, mint a fő üzenethurkban. Ehhez foglalja bele a szűrési műveleteket egy WH_MSGFILTER horog eljárásba, és a GetMessage és DispatchMessage függvények hívásai között hívja meg a CallMsgFilter függvényt.
while (GetMessage(&msg, (HWND) NULL, 0, 0))
{
if (!CallMsgFilter(&qmsg, 0))
DispatchMessage(&qmsg);
}
A CallMsgFilter utolsó argumentuma egyszerűen átkerül a horog eljárásba; bármilyen értéket megadhat. A horog eljárás egy olyan állandó definiálásával, mint a MSGF_MAINLOOP, ezzel az értékkel meghatározhatja, hogy az eljárás honnan lett meghívva.
További információért lásd a MessageProc, valamint a SysMsgProc visszahívási függvényeket.
WH_SHELL
Egy shell alkalmazás a WH_SHELL horog révén fontos értesítéseket fogadhat. A rendszer WH_SHELL horog eljárást hív meg, amikor a rendszerhéjalkalmazás aktiválásra készül, és amikor egy legfelső szintű ablak jön létre vagy megsemmisül.
Vegye figyelembe, hogy az egyéni shell-alkalmazások nem kapnak WH_SHELL üzeneteket. Ezért minden olyan alkalmazásnak, amely alapértelmezett rendszerhéjként regisztrálja magát, meg kell hívnia a SystemParametersInfo függvényt, mielőtt (ő vagy bármely más alkalmazás) fogadhatná az WH_SHELL üzeneteket. Ezt a függvényt SPI_SETMINIMIZEDMETRICS és MINIMIZEDMETRICS struktúrával kell meghívni. Állítsa a iArrange tagját ARW_HIDE.
További információ: lásd a ShellProc visszahívási függvényt.