Ako viete: C# je sprievodný jazyk k platforme .NET Framework a nie je možné implementovať globálne hooky s vlastnými knižnicami a nastaveniami kompilátora. V praxi však volania na nespravovaný kód platia v C#, pričom sa používa vlastnosť DllImport na odkazovanie na metódy v knižnici nespravovaného kódu. Hákové funkcie existujú v user32.dll a prototyp funkcie je nasledovný:
HHOOK WINAPI SetWindowsHookEx(
__in int idHook,
__in HOOKPROC lpfn,
__in HINSTANCE hMod,
__in DWORD dwThreadId);
Môže sa použiť na registráciu špecifického typu metódy spracovania zachytávania správ v operačnom systéme (Windows), napríklad môžeme zaregistrovať hák na blokovanie globálnych klávesových správ, takže všetky udalosti stlačenia a zdvihnutia klávesnice môžeme vnímať a spracovávať (nie je vylúčené, že existuje front-end hook na zapustenie správy).
Túto funkciu môžeme v C# označiť takto:
[DllImport("user32.dll")] public static extern int SetWindowsHookEx( HookType idHook, HookProc lpfn, IntPtr hInstance, int threadId );
Stojí za zmienku, že vyššie uvedené HookType a HookProc sú moje vlastné typy, čo nie je dôležité (pretože program pri spustení odovzdáva pamäťovú adresu), ale musí spĺňať určité špecifikácie.
Parametre funkcie zhora nadol sú:
idHook typ, ktorý je tu reprezentovaný tvarovaným enumom LPFN callback funkcia, keď prichádzajú do hry hooky hInstance modul handle aplikačnej inštancie (zvyčajne modulový handle aplikačnej inštancie, kde sa nachádza vaša hook callback funkcia) threadIdIdentifikátor vlákna priradeného k nainštalovanému hook podprogramu
Existuje niekoľko typov háčikov:
Zvyčajne používame 13 na blokovanie správ z klávesnice a 14 na blokovanie myšových správ.
Deklarácia funkcie callback Musíme použiť delegátov v C# a deklarácia je nasledovná: verejný delegát int HookProc(int nCode, int wParam, IntPtr lParam);
Parameter zhora nadol znamená, že parameter vrátený reťazcom nCode hooku, 0, znamená, že táto správa (predchádzajúca správa hookom) je zahodená, a non-0 znamená, že táto správa zostáva platná
parametre správy wParam
parameter správy lParam
Stojí za zmienku, že wParam a lParam sú rôzne typy rôznych typov správ, ale typy wParam možno približne vyjadriť nasledujúcou enumeráciou:
lParam je zvyčajne zapuzdrený ako štruktúra, ktorá sa líši v závislosti od typu správy, nasledujúce dve štruktúry sú štruktúra lParam myši a klávesnice:
Keď pochopíme vyššie uvedené informácie, máme základné pochopenie implementácie hákových funkcií v C# a potom venujeme pozornosť niekoľkým otázkam:
1. Hooky zaberajú veľa zdrojov a mali by byť včas zrušené, keď sa nepoužívajú, čo vyžaduje použitie funkcie UnhookWindowsHookEx
2. Z úcty by hák mal vrátiť výsledok spracovania ďalšieho háku, nie len výsledok spracovania aktuálneho háku (použite CallNextHookEx na zavolanie ďalšieho háku, keďže hák sa nastaví ako prvý a potom nadobudne účinok, takže by sa to malo urobiť na zabezpečenie normálneho doručenia reťazca hákov).
3. HInstance v parametri funkcie háčika je len tam, kde je funkcia spätného volania aktuálneho háku a musí byť zadaná správna adresa
4. Keďže je použitý delegát, malo by byť zabezpečené, že pamäťová adresa delegáta (odkaz na metódu) nebude zablokovaná, inak nastane výnimka pri vykonaní hooku
Môžete si stiahnuť ukážkový program, ktorý som napísal, ale môj program potrebuje nasledujúce hlavné body:
1. Zablokoval som implementáciu hákov a otvoril som len zachytávanie a spracovanie správ klávesnicou a myšou (spôsob použitia je rovnaký ako pri udalostiach myši a klávesnice vo WinForm v C#), a môžete otvoriť ďalšie
2. Hook som navrhol v singleton móde, môžeš ho zrušiť
3. V dôsledku určitého zásahu do operačného systému môže byť antivírusový softvér označený ako rizikový
4. Kód je zle napísaný, stačí sa s ním vystačiť......
Nakoniec, rozdiel medzi programovacou technológiou a jazykom je v tom, že ich kompilátory a používatelia sú odlišní, ľudia, ktorí používajú C, sa nedajú považovať za lepších ako tí, ktorí používajú Javu, a technológia sa nemusí nevyhnutne odrážať v ukazovateľoch, maticiach, dátových štruktúrach, pokiaľ rozumejú počítačovým princípom, princípom kompilácie, princípom operačného systému a podobne. Samozrejme, je dobré, že každý má svoj obľúbený jazyk a bežné programovacie metódy.
|