Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 17250|Odpověď: 0

[Tipy] Použití hookových funkcí v programovacích dovednostech v C# - SetWindowsHookEx

[Kopírovat odkaz]
Zveřejněno 07.02.2019 21:12:59 | | |
Jak víte: C# je doprovodný jazyk k platformě .NET Framework a není možné implementovat globální hooky s vlastními knihovnami a kompilátorovými opatřeními. V praxi však volání na nespravovaný kód platí v C#, kde se používá vlastnost DllImport k odkazování na metody v knihovně nespravovaného kódu. Háčkové funkce existují v user32.dll a prototyp funkce je následující:

HHOOK WINAPI SetWindowsHookEx(

__in int idHook,

__in HOOKPROC lpfn,

__in HINSTANCE hMod,

__in DWORD dwThreadId);

Lze jej použít k registraci specifického typu metody zpracování odposlechu zpráv v operačním systému (Windows), například můžeme zaregistrovat hák pro blokování globálních klávesových zpráv, takže všechny stisky a zdání kláves můžeme vnímat a zpracovávat (není vyloučeno, že existuje front-end hook pro zapuštění zprávy).

Tuto funkci můžeme v C# označit takto:

  [DllImport("user32.dll")]
        public static extern int SetWindowsHookEx(
            HookType idHook,
            HookProc lpfn,
            IntPtr hInstance,
            int threadId
            );

Stojí za zmínku, že výše uvedené HookType a HookProc jsou mé vlastní typy, což není důležité (protože program při běhu předává paměťovou adresu), ale musí splňovat určité specifikace.

Parametry funkce odshora dolů jsou:

  idHook type, který je zde znázorněn tvarovaným enumem
     Funkce LPFN callback, když přicházejí na řadu háčky
     handle modulu hInstance instance instance instance (obvykle modul handle instance aplikace, kde se nachází vaše hook callback funkce)
       threadIdIdentifikátor vlákna spojeného s instalovaným hook podprogramem

Existuje několik typů háčků:
Obvykle používáme 13 k blokování zpráv z klávesnice a 14 k blokování myší.

Deklarace callback funkce Musíme použít delegáty v C# a deklarace je následující:
    veřejný delegát int HookProc(int nCode, int wParam, IntPtr lParam);

Parametr shora dolů znamená, že parametr vrácený řetězcem nCode hooku, 0 znamená, že tato zpráva (předchozím hookem zprávy) je zamítnuta, a non-0 znamená, že tato zpráva zůstává platná

parametry zprávy wParam

parametr zprávy lParam

Stojí za zmínku, že wParam a lParam jsou různé typy různých typů zpráv, ale typy wParam lze přibližně reprezentovat následujícím výčtem:
lParam je obecně zapouzdřen jako struktura, která se liší podle typu zprávy, následující dvě struktury jsou struktura lParam myší a klávesnice:
Když pochopíme výše uvedené informace, máme základní pochopení implementace háčkových funkcí v C# a poté věnujeme pozornost několika otázkám:

1. Hooky zabírají mnoho zdrojů a měly by být včas zrušeny, pokud nejsou používány, což vyžaduje použití funkce UnhookWindowsHookEx

2. Z ohleduplnosti by hák měl vrátit výsledek zpracování dalšího háku, nikoli pouze výsledek zpracování aktuálního háku (použijte CallNextHookEx k zavolání dalšího háku, protože háček je nastaven nejprve a pak nabývá účinnosti, takže by to mělo být provedeno tak, aby bylo zajištěno normální doručení řetězce háku).

3. Instance v parametru hook funkce je pouze tam, kde je callback funkce aktuálního hooku a musí být uvedena správná adresa

4. Protože je použit delegát, mělo by být zajištěno, že paměťová adresa delegáta (odkaz na metodu) nebude zablokována, jinak nastane výjimka při provedení hooku



Můžete si stáhnout ukázkový program, který jsem napsal, ale můj program potřebuje následující hlavní body:

1. Zablokoval jsem implementaci háků a otevřel jsem pouze zachycení a zpracování zpráv pomocí klávesnice a myši (způsob použití je stejný jako u myší a klávesnice ve WinForm v C#), a můžete otevřít i další

2. Navrhl jsem háček v singleton módu, můžete ho zrušit

3. Kvůli určitému zásahu do operačního systému může být antivirový software označen jako rizikový

4. Kód je špatně napsaný, prostě se s ním vystač......



Nakonec rozdíl mezi programovací technologií a jazykem je v tom, že jejich kompilátory a uživatelé jsou odlišní, lidé, kteří používají C, nemohou být považováni za lepší než ti, kteří používají Javu, a technologie se nemusí nutně odrážet v ukazatelích, maticích, datových strukturách, pokud rozumí počítačovým principům, principům kompilace, principům operačních systémů atd. Samozřejmě je dobře, že každý má svůj oblíbený jazyk a obvyklé programovací metody.





Předchozí:Čistá implementace hooku v C#
Další:【Jiangshi WeChat Multi-Open】WeChat Scan Code Optional Login|Unlimited Multi-Open|Uložit Přihlášení
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com