Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 17250|Odgovoriti: 0

[Napitnine] Uporaba kljukastih funkcij v programskih veščinah v C# - SetWindowsHookEx

[Kopiraj povezavo]
Objavljeno na 7. 02. 2019 21:12:59 | | |
Kot veste: C# je spremljevalni jezik platformi .NET Framework in ni mogoče implementirati globalnih kljuk z lastnimi knjižnicami in prevajalniki. V praksi pa klici na neupravljano kodo veljajo v C#, kjer se uporablja lastnost DllImport za referenciranje metod v knjižnici neupravljane kode. Funkcije kljuke obstajajo v user32.dll, prototip funkcije pa je naslednji:

HHOOK WINAPI SetWindowsHookEx(

__in int idHook,

__in HOOKPROC lpfn,

__in HINSTANCE hMod,

__in DWORD dwThreadId);

Uporablja se lahko za registracijo določene vrste metode obdelave prestrezanja sporočil v operacijskem sistemu (Windows), na primer, lahko registriramo kavelj za blokiranje globalnih sporočil s tipkovnice, tako da lahko zaznamo in obdelamo vse dogodke pritiska in dviga tipkovnice (ni izključeno, da obstaja front-end hook za spuščanje sporočila).

To funkcijo lahko v C# referenciramo tako, da jo označimo takole:

  [DllImport("user32.dll")]
        public static extern int SetWindowsHookEx(
            HookType idHook,
            HookProc lpfn,
            IntPtr hInstance,
            intthreadId
            );

Vredno je omeniti, da sta HookType in HookProc zgoraj moja lastna tipa, kar ni pomembno (ker program med izvajanjem posreduje pomnilniški naslov), vendar mora izpolnjevati določene specifikacije.

Parametri funkcije od zgoraj navzdol so:

  idHook tip, ki je tukaj predstavljen z oblikovanim enumom
     LPFN funkcija povratnega klica, ko pridejo v igro kljuke
     ročaj modula hInstance instance instance (običajno ročaj modula instance aplikacije, kjer se nahaja funkcija povratnega klica hooka)
       threadIdIdentifikator niti, povezane z nameščenim podprogramom hook

Obstaja več vrst kljuk:
Običajno uporabljamo 13 za blokiranje sporočil na tipkovnici in 14 za blokiranje sporočil na miški.

Deklaracija funkcije callback V C# moramo uporabiti delegate, deklaracija pa je naslednja:
    javni delegat int HookProc(int nCode, int wParam, IntPtr lParam);

Parameter od zgoraj navzdol pomeni, da parameter, ki ga vrne nCode kljuka, 0 pomeni, da je to sporočilo (prek prejšnjega kljuke sporočila) zavrženo, in ne-0 pomeni, da je to sporočilo še vedno veljavno

parametri sporočila wParam

parameter sporočila lParam

Vredno je omeniti, da sta wParam in lParam različni vrsti različnih vrst sporočil, vendar lahko vrste wParam približno predstavimo z naslednjo enumeracijo:
lParam je običajno enkapsuliran kot struktura, ki se razlikuje glede na vrsto sporočila; naslednji dve strukturi sta lParam struktura sporočil miške in tipkovnice:
Ko razumemo zgornje informacije, imamo osnovno razumevanje C# implementacije kljukastih funkcij in nato posvetimo pozornost nekaj vprašanjem:

1. Hooki porabijo veliko virov in jih je treba pravočasno preklicati, ko niso v uporabi, kar zahteva uporabo funkcije UnhookWindowsHookEx

2. Iz vljudnosti naj kljuka vrne rezultat obdelave naslednje kljuke, ne pa samo izid obdelave trenutne kljuke (uporabite CallNextHookEx za klic naslednje kljuke, saj se kljuka najprej nastavi in nato začne veljati, zato je treba to storiti za zagotovitev normalne dostave verige kljuke).

3. HInstance v parametru funkcije kljuke je le tam, kjer je funkcija povratne klice trenutne kljuke, in mora biti podan pravilen naslov

4. Ker je delegat uporabljen, je treba zagotoviti, da pomnilniški naslov delegata (referenca na metodo) ne bo zanikan, sicer bo ob izvedbi hooka izjema



Lahko prenesete vzorčni program, ki sem ga napisal, vendar moj program potrebuje naslednje glavne točke:

1. Blokiral sem implementacijo kljuk in odprl le prestrezanje in obdelavo sporočil s tipkovnico in miško (način uporabe je enak kot pri dogodkih miške in tipkovnice v C# WinForm), lahko pa odprete tudi druge

2. Hook sem zasnoval v singleton načinu, lahko ga prekličeš

3. Zaradi določenih vdorov v operacijski sistem je protivirusna programska oprema lahko označena kot tvegana

4. Koda je slabo napisana, preprosto se zadovolji z njo......



Nazadnje je razlika med programsko tehnologijo in jezikom v tem, da so njuni prevajalniki in uporabniki različni, ljudje, ki uporabljajo C, ne moremo reči, da so boljši od tistih, ki uporabljajo Javo, tehnologija pa ni nujno odsevana v kazalcih, matrikah, podatkovnih strukturah, dokler razumejo računalniška načela, načela prevajanja, operacijskega sistema itd. Seveda je dobro, da ima vsak svoj najljubši jezik in običajne metode programiranja.





Prejšnji:Čista implementacija C# hooka
Naslednji:【Jiangshi WeChat Multi-Open】WeChat Skeniranje kode Neobvezno Prijava|Neomejeno več-odprto|Konfiguracija prijave za shranjevanje
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com