Zoals u weet: C# is een begeleidende taal van het .NET Framework-platform, en het is niet mogelijk om globale hooks te implementeren met eigen bibliotheken en compilerprovisions. Maar in de praktijk blijven aanroepen van onbeheerde code waar in C#, waarbij de eigenschap DllImport wordt gebruikt om methoden in de unmanaged codebibliotheek te refereren. Haakfuncties bestaan in user32.dll, en het functieprototype is als volgt:
HHOOK WINAPI SetWindowsHookEx(
__in int idHook,
__in HOOKPROC lpfn,
__in VOORBEELD hMod,
__in DWORD dwThreadId);
Het kan worden gebruikt om een specifiek type berichtonderscheppingverwerkingsmethode te registreren bij het besturingssysteem (Windows), bijvoorbeeld kunnen we een hook registreren om globale toetsenbordberichten te blokkeren, zodat alle toetsenborddruk- en liftgebeurtenissen door ons kunnen worden waargenomen en verwerkt (het wordt niet uitgesloten dat er een front-end hook is om het bericht te laten vallen).
We kunnen deze functie in C# refereren door het als volgt te declareren:
[DllImport("user32.dll")] publieke statische externe int SetWindowsHookEx( HookType idHook, HookProc lpfn, IntPtr hInstance, int threadId );
Het is het vermelden waard dat de hierboven genoemde HookType en HookProc mijn eigen types zijn, wat niet belangrijk is (omdat het programma een geheugenadres doorgeeft tijdens het draaien), maar het moet wel aan bepaalde specificaties voldoen.
De parameters van de functie van boven naar beneden zijn:
het type idHook wordt hier weergegeven door een gevormde enum LPFN callbackfunctie wanneer hooks in werking komen hInstance module handle van de applicatie-instantie (meestal de modulehandle van de applicatie-instantie waar je hook callback-functie zich bevindt) threadIdDe identificatie van de thread die is gekoppeld aan de gestationeerde hook-subroutine
Er zijn verschillende soorten haken:
We gebruiken meestal 13 om toetsenbordberichten te blokkeren en 14 om muisberichten te blokkeren.
De declaratie van de callback-functie We moeten delegates in C# gebruiken, en de declaratie is als volgt: publieke delegate int HookProc (int nCode, int wParam, IntPtr lParam);
De top-down parameter betekent dat de parameter die teruggegeven wordt door de nCode hook chain, 0 betekent dat dit bericht (via de vorige berichthook) wordt weggegooid, en niet-0 betekent dat dit bericht geldig blijft
wParam-berichtparameters
lParam berichtparameter
Het is vermeldenswaard dat wParam en lParam verschillende typen van verschillende berichttypes zijn, maar de typen wParam kunnen ruwweg worden weergegeven door de volgende enumeratie:
lParam wordt over het algemeen ingekapseld als een structuur, die varieert afhankelijk van het type bericht; de volgende twee structuren zijn de lParam-structuur van muis- en toetsenbordberichten:
Wanneer we bovenstaande informatie begrijpen, hebben we een basisbegrip van de C#-implementatie van hookfuncties, en letten we vervolgens op een paar vragen:
1. Hooks nemen veel middelen in beslag en moeten in de loop van de tijd worden geannuleerd als ze niet in gebruik zijn, wat het gebruik van de UnhookWindowsHookEx-functie vereist
2. Uit hoffelijkheid moet de hook het verwerkingsresultaat van de volgende hook teruggeven, niet alleen het verwerkingsresultaat van de huidige hook alleen (gebruik CallNextHookEx om de volgende hook aan te roepen, aangezien de hook eerst wordt ingesteld en dan van kracht wordt, dus dit moet gebeuren om de normale levering van de hook chain te waarborgen).
3. De hInstance in de parameter van de hookfunctie is alleen waar de callbackfunctie van de huidige hook is, en het juiste adres moet worden gegeven
4. Omdat de delegate wordt gebruikt, moet worden gegarandeerd dat het geheugenadres van de delegate (verwijzing naar de methode) niet wordt verstoord, anders is er een uitzondering wanneer de hook wordt uitgevoerd
Je kunt het voorbeeldprogramma dat ik schreef downloaden, maar mijn programma vereist de volgende hoofdpunten:
1. Ik blokkeerde de implementatie van hooks en opende alleen de berichten onderscheppen en verwerken van toetsenbord en muis (de gebruiksmethode is hetzelfde als bij de WinForm muis- en toetsenbordgebeurtenissen van C#), en je kunt andere openen
2. Ik heb de haak ontworpen om in singleton-modus te staan, je kunt het annuleren
3. Door bepaalde inbraak in het besturingssysteem kan antivirussoftware als risicovol worden gerapporteerd
4. De code is slecht geschreven, doe het er maar mee......
Ten slotte is het verschil tussen programmeertechnologie en taal dat hun compilers en gebruikers verschillend zijn, mensen die C gebruiken niet als hoger kunnen worden beschouwd dan degenen die Java gebruiken, en technologie wordt niet per se weerspiegeld in pointers, matrices, datastructuren, zolang mensen computerprincipes, compilatieprincipes, besturingssysteemprincipes, enzovoort begrijpen. Natuurlijk is het goed dat iedereen zijn eigen favoriete taal en gebruikelijke programmeermethoden heeft.
|