Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 17250|Odpoveď: 0

[Tipy] Použitie hook funkcií v programovacích zručnostiach v C# - SetWindowsHookEx

[Kopírovať odkaz]
Zverejnené 7. 2. 2019 21:12:59 | | |
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.





Predchádzajúci:Čistá implementácia C# hooku
Budúci:【Jiangshi WeChat Multi-Open】WeChat Scan Code Voliteľné prihlásenie|Neobmedzené Multi-Open|Uložiť Konfigurácia prihlásenia
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com