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.
|