Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 17250|Svare: 0

[Tips] Bruk av hook-funksjoner i C#-programmeringsferdigheter - SetWindowsHookEx

[Kopier lenke]
Publisert på 07.02.2019 21:12:59 | | |
Som du vet: C# er et følgespråk til .NET Framework-plattformen, og det er ikke mulig å implementere globale kroker med egne biblioteker og kompilatorinnstillinger. Men i praksis gjelder kall til uadministrert kode i C#, ved å bruke DllImport-egenskapen for å referere til metoder i det uadministrerte kodebiblioteket. Krokfunksjoner finnes i user32.dll, og funksjonsprototypen er som følger:

HHOOK WINAPI SetWindowsHookEx(

__in int idHook,

__in HOOKPROC lpfn,

__in HINSTANCE hMod,

__in DWORD dwThreadId);

Den kan brukes til å registrere en spesifikk type meldingsavlyttingsmetode med operativsystemet (Windows), for eksempel kan vi registrere en hook for å blokkere globale tastaturmeldinger, slik at alle tastaturtrykk- og løfthendelser kan oppfattes og behandles av oss (det utelukkes ikke at det finnes en front-end hook for å slippe meldingen).

Vi kan referere til denne funksjonen i C# ved å erklære den slik:

  [DllImport("user32.dll")]
        offentlig statisk ekstern int SetWindowsHookEx(
            HookType idHook,
            HookProc lpfn,
            IntPtr hInstance,
            int threadId
            );

Det er verdt å nevne at HookType og HookProc ovenfor er mine egendefinerte typer, noe som ikke er viktig (fordi programmet sender en minneadresse under kjøring), men det må oppfylle visse spesifikasjoner.

Parameterne til funksjonen fra topp til bunn er:

  idHook type, som her er representert ved et formet enum
     LPFN-callback-funksjonen når kroker kommer i spill
     hInstance modulhåndtak for applikasjonsinstansen (vanligvis modulhåndtaket til applikasjonsinstansen der hook callback-funksjonen din er plassert)
       threadIdIdentifikatoren til tråden assosiert med den installerte hook-subrutinen

Det finnes flere typer kroker:
Vi bruker vanligvis 13 for å blokkere tastaturmeldinger og 14 for å blokkere musemeldinger.

Deklarasjonen av callback-funksjonen Vi må bruke delegater i C#, og erklæringen er som følger:
    offentlig delegat int HookProc (int nCode, int wParam, IntPtr lParam);

Top-down-parameteren betyr at parameteren som sendes tilbake av nCode-krokkjeden, 0 betyr at denne meldingen (ved forrige meldingskroke) forkastes, og ikke-0 betyr at denne meldingen fortsatt er gyldig

wParam-meldingsparametere

lParam meldingsparameter

Det er verdt å nevne at wParam og lParam er forskjellige typer forskjellige meldingstyper, men typene wParam kan grovt representeres ved følgende oppramsning:
lParam er vanligvis innkapslet som en struktur, noe som varierer avhengig av meldingstype; følgende to strukturer er lParam-strukturen for muse- og tastaturmeldinger:
Når vi forstår informasjonen ovenfor, har vi en grunnleggende forståelse av C#-implementeringen av hook-funksjoner, og deretter følger vi med på noen spørsmål:

1. Hooks bruker mye ressurser, og bør kanselleres i tide når de ikke er i bruk, noe som krever bruk av UnhookWindowsHookEx-funksjonen

2. Av hensyn skal hooken returnere behandlingsresultatet av neste hook, ikke behandlingsresultatet av den nåværende hooken alene (bruk CallNextHookEx for å kalle neste hook, siden hooken settes først og deretter trer i kraft, så det bør gjøres for å sikre normal levering av hook-kjeden).

3. hInstansen i hook-funksjonsparameteren er kun der callback-funksjonen til den nåværende hooken er, og korrekt adresse må være gitt

4. Siden delegaten brukes, bør det sikres at minneadressen til delegaten (referanse til metoden) ikke blir ødelagt, ellers vil det være et unntak når hooken kjøres



Du kan laste ned eksempelprogrammet jeg skrev, men programmet mitt trenger følgende hovedpunkter:

1. Jeg blokkerte implementeringen av hooks, og åpnet bare meldingsavskjæring og behandling av tastatur og mus (bruksmetoden er den samme som i C#s WinForm mus- og tastaturhendelser), og du kan åpne andre

2. Jeg designet kroken til å være i singleton-modus, du kan avbryte den

3. På grunn av visse inntrengninger i operativsystemet kan antivirusprogramvare rapporteres som risikabelt

4. Koden er dårlig skrevet, bare gjør det med det......



Til slutt er forskjellen mellom programmeringsteknologi og språk at deres kompilatorer og brukere er forskjellige, folk som bruker C kan ikke sies å være høyere enn de som bruker Java, og teknologi reflekteres ikke nødvendigvis i pekere, matriser, datastrukturer, så lenge folk forstår datamaskinprinsipper, kompilasjonsprinsipper, operativsystemprinsipper osv. Selvfølgelig er det bra at alle har sitt eget favorittspråk og vanlige programmeringsmetoder.





Foregående:Ren C#-krokimplementering
Neste:【Jiangshi WeChat Multi-Open】WeChat Scan Code Valgfri innlogging|Ubegrenset Multi-Open|Lagre innloggingskonfigurasjon
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com