Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 17250|Antwoord: 0

[Tips] Gebruik van hook-functies in C#-programmeervaardigheden - SetWindowsHookEx

[Link kopiëren]
Geplaatst op 07-02-2019 21:12:59 | | |
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.





Vorig:Pure C# hook-implementatie
Volgend:【Jiangshi WeChat Multi-Open】WeChat Scancode Optionele Login|Onbeperkt Multi-Open|Inlogconfiguratie opslaan
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com