See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 17250|Vastuse: 0

[Nõuanded] Konksufunktsioonide kasutamine C# programmeerimisoskustes - SetWindowsHookEx

[Kopeeri link]
Postitatud 07.02.2019 21:12:59 | | |
Nagu sa tead: C# on .NET Framework platvormi kaaslanekeel ja pole võimalik rakendada globaalseid hooke oma teekide ja kompilaatori tingimustega. Kuid praktikas kehtivad juhitud koodi kutsed C#-s, kasutades DllImport omadust, et viidata haldamata kooditeegi meetoditele. Konksufunktsioonid eksisteerivad user32.dll ning funktsiooni prototüüp on järgmine:

HHOOK WINAPI SetWindowsHookEx(

__in int idHook,

__in HOOKPROC lpfn,

__in HINSTANCE hMod,

__in DWORD dwThreadId);

Seda saab kasutada teatud tüüpi sõnumite pealtkuulamise töötlemise meetodi registreerimiseks operatsioonisüsteemis (Windows), näiteks saame registreerida konksu, mis blokeerib globaalseid klaviatuuri sõnumeid, nii et kõik klaviatuuri vajutamise ja tõstmise sündmused on meie poolt tajutavad ja töödeldakse (ei välista, et sõnumi eemaldamiseks on olemas front-endi konks).

Seda funktsiooni saame C#-s viidata, deklareerides selle järgmiselt:

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

Tasub mainida, et ülaltoodud HookType ja HookProc on minu kohandatud tüübid, mis pole oluline (sest programm edastab käivitamisel mäluaadressi), kuid peab vastama teatud spetsifikatsioonidele.

Funktsiooni parameetrid ülevalt alla on:

  idHooki tüüp, mida siin esindab kujuline enum
     LPFN-i tagasikutsumise funktsioon, kui konksud mängu tulevad
     hInstance mooduli käepide rakenduse instantsilt (tavaliselt selle rakenduse instantsi moodulikäepide, kus asub teie hook callback funktsioon)
       threadIdLõime identifikaator, mis on seotud paigaldatud konksu alamprogrammiga

On mitut tüüpi konksusid:
Tavaliselt kasutame 13 klaviatuuri sõnumite blokeerimiseks ja 14 hiiresõnumite blokeerimiseks.

Tagasikutsumise funktsiooni deklaratsioon Peame kasutama delegaate C#-s ning deklaratsioon on järgmine:
    public delegate int HookProc(int nCode, int wParam, IntPtr lParam);

Ülalt-alla parameeter tähendab, et parameeter, mis edastatakse tagasi nCode konksuahela kaudu, 0 tähendab, et see sõnum (eelmise sõnumi konksu kaudu) visatakse ära, ja mitte-0 tähendab, et see sõnum kehtib jätkuvalt

wParam sõnumiparameetrid

lParam sõnumiparameeter

Tasub mainida, et wParam ja lParam on erinevad sõnumitüübid, kuid wParam'i tüüpe saab ligikaudselt esitada järgmise loeteluga:
lParam on üldiselt kapseldatud struktuurina, mis varieerub sõltuvalt sõnumi tüübist; järgmised kaks struktuuri on hiire ja klaviatuuri sõnumite lParam struktuur:
Kui mõistame ülaltoodud infot, saame põhilise arusaama konksfunktsioonide C# rakendusest ning pöörame tähelepanu mõnele küsimusele:

1. Konksud võtavad palju ressursse ja neid tuleks aja jooksul tühistada, kui neid ei kasutata, mis nõuab UnhookWindowsHookEx funktsiooni kasutamist

2. Viisakusest peaks konks tagastama järgmise konksu töötlemistulemuse, mitte ainult praeguse konksu töötlemistulemuse (kasuta CallNextHookEx-i järgmise konksu kutsumiseks, kuna konks on seatud esimesena ja seejärel jõustub, seega tuleks see teha konksude ahela normaalse edastamise tagamiseks).

3. Hook-funktsiooni parameetri hInstance on ainult seal, kus praeguse konksu tagasikutsumise funktsioon on ja õige aadress tuleb anda

4. Kuna delegaati kasutatakse, tuleb tagada, et delegaadi mäluaadress (viide meetodile) ei läheks prügi, vastasel juhul tekib erand konksu käivitamisel



Võite alla laadida minu kirjutatud näidisprogrammi, kuid minu programm vajab järgmisi põhipunkte:

1. Blokeerisin konksude rakendamise ja avasin ainult klaviatuuri ja hiire sõnumite pealtkuulamise ja töötlemise (kasutusviis on sama mis C# WinForm hiire ja klaviatuuri sündmustel), ning saad avada teisi

2. Ma disainisin konksu nii, et see oleks singleton-režiimis, saad selle tühistada

3. Teatud sissetungi tõttu operatsioonisüsteemi võib viirusetõrjetarkvara olla ohtlik

4. Kood on halvasti kirjutatud, lihtsalt lepi sellega......



Lõpuks on erinevus programmeerimistehnoloogia ja keele vahel see, et nende kompilaatorid ja kasutajad on erinevad, C-d kasutavad inimesed ei saa pidada kõrgemaks kui need, kes kasutavad Java, ning tehnoloogia ei pruugi kajastuda viidetes, maatriksites, andmestruktuurides, peaasi, et inimesed, kes mõistavad arvutipõhimõtteid, kompileerimispõhimõtteid, operatsioonisüsteemi põhimõtteid jne. Muidugi on hea, et kõigil on oma lemmikkeel ja tavapärased programmeerimismeetodid.





Eelmine:Puhas C# konksu rakendus
Järgmine:【Jiangshi WeChat Multi-Open】WeChat Scan Code Valikuline sisselogimine|Piiramatu Multi-Open|Salvesta sisselogimise konfiguratsioon
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com