Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 17250|Svar: 0

[Tips] Brug af hook-funktioner i C#-programmeringsfærdigheder - SetWindowsHookEx

[Kopier link]
Opslået på 07/02/2019 21.12.59 | | |
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.





Tidligere:Ren C# hook-implementering
Næste:【Jiangshi WeChat Multi-Open】WeChat Scankode Valgfri login|Ubegrænset Multi-Open|Gem loginkonfiguration
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com