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.
|