Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 17250|Atsakyti: 0

[Patarimai] Kablio funkcijų naudojimas C# programavimo įgūdžiams - SetWindowsHookEx

[Kopijuoti nuorodą]
Paskelbta 2019-02-07 21:12:59 | | |
Kaip žinote: C# yra .NET Framework platformos pagalbinė kalba, todėl neįmanoma įdiegti globalių kabliukų su savo bibliotekomis ir kompiliatoriaus nuostatomis. Tačiau praktiškai nevaldomojo kodo iškvietimai galioja C#, naudojant ypatybę DllImport nevaldomojo kodo bibliotekos metodams. Kabliuko funkcijos egzistuoja user32.dll, o funkcijos prototipas yra toks:

HHOOK WINAPI SetWindowsHookEx(

__in int idHook,

__in HOOKPROC lpfn,

__in HINSTANCE hMod,

__in DWORD dwThreadId);

Jis gali būti naudojamas norint užregistruoti tam tikro tipo pranešimų perėmimo apdorojimo metodą operacinėje sistemoje ("Windows"), pavyzdžiui, galime užregistruoti kabliuką, kad blokuotume visuotinius klaviatūros pranešimus, kad galėtume suvokti ir apdoroti visus klaviatūros paspaudimo ir pakėlimo įvykius (neatmetama galimybė, kad yra priekinis kabliukas, skirtas pranešimui numesti).

Šią funkciją galime nurodyti C#, deklaruodami ją taip:

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

Verta paminėti, kad aukščiau esantys "HookType" ir "HookProc" yra mano pasirinktiniai tipai, o tai nėra svarbu (nes programa paleisdama perduoda atminties adresą), tačiau ji turi atitikti tam tikras specifikacijas.

Funkcijos parametrai iš viršaus į apačią yra šie:

  idHook tipas, kurį čia vaizduoja formos išvardijimas
     LPFN atgalinio skambučio funkcija, kai įsijungia kabliukai
     hProgramos egzemplioriaus modulio rankena (paprastai programos egzemplioriaus, kuriame yra jūsų kablio atgalinio skambinimo funkcija, modulio rankenėlė)
       threadIdSu įdiegta kabliuko paprograme susietos gijos identifikatorius

Yra keletas kabliukų tipų:
Paprastai naudojame 13 klaviatūros pranešimams blokuoti, o 14 – pelės pranešimams blokuoti.

Atgalinio skambinimo funkcijos deklaracija C# turime naudoti atstovus, o deklaracija yra tokia:
    viešasis atstovas int HookProc(int nCode, int wParam, IntPtr lParam);

Parametras iš viršaus į apačią reiškia, kad parametras perduodamas atgal nCode kabliuko grandinės, 0 reiškia, kad šis pranešimas (pagal ankstesnį pranešimo kabliuką) yra atmestas, o ne 0 reiškia, kad šis pranešimas ir toliau galioja

wParam pranešimo parametrai

lParam pranešimo parametras

Verta paminėti, kad wParam ir lParam yra skirtingi skirtingų pranešimų tipų tipai, tačiau wParam tipus galima apytiksliai pavaizduoti tokiu išvardijimu:
lParam paprastai yra kapsuliuojama kaip struktūra, kuri skiriasi priklausomai nuo pranešimo tipo, šios dvi struktūros yra lParam pelės ir klaviatūros pranešimų struktūra:
Kai suprantame aukščiau pateiktą informaciją, turime pagrindinį supratimą apie C# kabliuko funkcijų įgyvendinimą ir tada atkreipiame dėmesį į keletą klausimų:

1. Kabliukai užima daug išteklių ir turėtų būti laiku atšaukti, kai jie nenaudojami, o tam reikia naudoti funkciją "UnhookWindowsHookEx"

2. Mandagumo dėlei kabliukas turėtų grąžinti kito kabliuko apdorojimo rezultatą, o ne vien dabartinio kabliuko apdorojimo rezultatą (naudokite CallNextHookEx, kad iškviestumėte kitą kabliuką, nes kabliukas nustatomas pirmiausia, o tada įsigalioja, todėl tai turėtų būti padaryta siekiant užtikrinti normalų kabliuko grandinės pristatymą).

3. Kabliuko funkcijos parametre hInstance yra tik ten, kur yra dabartinio kabliuko atgalinio iškvietimo funkcija, ir turi būti nurodytas teisingas adresas

4. Kadangi naudojamas delegatas, reikia užtikrinti, kad atstovo atminties adresas (nuoroda į metodą) nebus šiukšlinamas, kitaip bus išimtis, kai kabliukas bus vykdomas



Galite atsisiųsti mano parašytą programos pavyzdį, tačiau mano programai reikia šių pagrindinių punktų:

1. Aš užblokavau kabliukų įgyvendinimą ir tik atidariau pranešimų perėmimą ir klaviatūros ir pelės apdorojimą (naudojimo metodas yra toks pat kaip C # WinForm pelės ir klaviatūros įvykiai), ir jūs galite atidaryti kitus

2. Aš sukūriau kabliuką taip, kad jis būtų vieno tono režimu, galite jį atšaukti

3. Dėl tam tikro įsibrovimo į operacinę sistemą antivirusinė programinė įranga gali būti pranešta kaip rizikinga

4. Kodas blogai parašytas, tiesiog susitaikykite su juo......



Galiausiai, skirtumas tarp programavimo technologijos ir kalbos yra tas, kad jų kompiliatoriai ir jų vartotojai yra skirtingi, negalima sakyti, kad žmonės, kurie naudoja C, yra aukštesni už tuos, kurie naudoja Java, o technologijos nebūtinai atsispindi rodyklėse, matricose, duomenų struktūrose, jei tik žmonės supranta kompiuterio principus, kompiliavimo principus, operacinės sistemos principus ir kt. Žinoma, gerai, kad kiekvienas turi savo mėgstamą kalbą ir įprastus programavimo metodus.





Ankstesnis:Grynas C# kabliuko įgyvendinimas
Kitą:【Jiangshi WeChat Multi-Open】 WeChat nuskaitymo kodas Pasirenkamas prisijungimas|Neribotas kelių atidarymų|Išsaugoti prisijungimo konfigūraciją
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com