Som du ved: C# er et ledsagende sprog til .NET Framework-platformen, og det er ikke muligt at implementere globale hooks med egne biblioteker og compiler-provisioner. Men i praksis gælder kald til uadministreret kode i C#, hvor DllImport-egenskaben bruges til at referere til metoder i det uadministrerede kodebibliotek. Hook-funktioner findes i user32.dll, og funktionsprototypen er som følger:
HHOOK WINAPI SetWindowsHookEx(
__in int idHook,
__in HOOKPROC lpfn,
__in EKSEMPEL hMod,
__in DWORD dwThreadId);
Det kan bruges til at registrere en bestemt type meddelelsesopsnapningsmetode med operativsystemet (Windows), for eksempel kan vi registrere en hook til at blokere globale tastaturmeddelelser, så alle tastaturtryk og lift-begivenheder kan opfattes og behandles af os (det udelukkes ikke, at der er en front-end hook til at aflevere beskeden).
Vi kan referere til denne funktion i C# ved at erklære den sådan her:
[DllImport("user32.dll")] offentlig statisk ekstern int SetWindowsHookEx( HookType idHook, HookProc lpfn, IntPtr hInstance, int threadID );
Det er værd at nævne, at HookType og HookProc ovenfor er mine brugerdefinerede typer, hvilket ikke er vigtigt (fordi programmet sender en hukommelsesadresse under kørsel), men det skal opfylde visse specifikationer.
Parametrene for funktionen fra top til bund er:
idHook-typen, som her repræsenteres ved en formet enum LPFN callback-funktion, når hooks kommer i spil hInstance modul-handle for applikationsinstansen (normalt modulhåndtaget for applikationsinstansen, hvor din hook callback-funktion er placeret) threadIdIdentifikatoren for tråden, der er tilknyttet den installerede hook-subrutine
Der findes flere typer kroge:
Vi bruger generelt 13 til at blokere tastaturbeskeder og 14 til at blokere musebeskeder.
Deklarationen af callback-funktionen Vi skal bruge delegerede i C#, og deklarationen er som følger: offentlig delegeret int HookProc (int nCode, int wParam, IntPtr lParam);
Top-down parameteren betyder, at parameteren returneres af nCode hook-kæden, 0 betyder, at denne besked (ved den forrige meddelelseshook) kasseres, og ikke-0 betyder, at denne besked fortsat er gyldig
wParam-meddelelsesparametre
lParam meddelelsesparameter
Det er værd at nævne, at wParam og lParam er forskellige typer af forskellige beskedtyper, men typerne af wParam kan groft repræsenteres ved følgende opremsning:
lParam indkapsles generelt som en struktur, hvilket varierer afhængigt af typen af besked; følgende to strukturer er lParam-strukturen med mus- og tastaturbeskeder:
Når vi forstår ovenstående information, har vi en grundlæggende forståelse af C#-implementeringen af hook-funktioner, og derefter lægger vi mærke til nogle få spørgsmål:
1. Hooks bruger mange ressourcer og bør annulleres i tide, når de ikke er i brug, hvilket kræver brug af UnhookWindowsHookEx-funktionen
2. Af hensyn skal hooken returnere behandlingsresultatet af den næste hook, ikke behandlingsresultatet af den aktuelle hook alene (brug CallNextHookEx til at kalde den næste hook, da hooken sættes først og derefter træder i kraft, så det bør gøres for at sikre normal levering af hookkæden).
3. hInstancen i hook-funktionsparameteren er kun der, hvor callback-funktionen for den aktuelle hook er, og den korrekte adresse skal være angivet
4. Fordi delegaten bruges, skal det sikres, at delegatens hukommelsesadresse (reference til metoden) ikke bliver ødelagt, ellers vil der være en undtagelse, når hooken udføres
Du kan downloade det eksempelprogram, jeg har skrevet, men mit program har brug for følgende hovedpunkter:
1. Jeg blokerede implementeringen af hooks og åbnede kun for beskedopsnapning og behandling af tastatur og mus (brugsmetoden er den samme som i C#'s WinForm mus- og tastaturbegivenheder), og du kan åbne andre
2. Jeg designede krogen, så den var i singleton-tilstand, du kan annullere den
3. På grund af visse indtrængen i operativsystemet kan antivirussoftware rapporteres som risikabelt
4. Koden er dårligt skrevet, så bare nøjes med den......
Endelig er forskellen mellem programmeringsteknologi og sprog, at deres compilere og brugere er forskellige, folk der bruger C kan ikke siges at være højere end dem, der bruger Java, og teknologi afspejles ikke nødvendigvis i pointers, matricer, datastrukturer, så længe folk forstår computerprincipper, kompilationsprincipper, operativsystemprincipper osv. Selvfølgelig er det godt, at alle har deres eget yndlingssprog og sædvanlige programmeringsmetoder.
|