Kuten tiedät: C# on .NET Framework -alustan rinnakkaiskieli, eikä ole mahdollista toteuttaa globaaleja hookeja omilla kirjastoillaan ja kääntäjäohjelmillaan. Mutta käytännössä kutsut hallitsemattomaan koodiin pätevät C#:ssa, käyttäen DllImport-ominaisuutta viitatakseen metodeihin hallitsemattomassa koodikirjastossa. Koukkufunktioita on olemassa user32.dll, ja funktion prototyyppi on seuraava:
HHOOK WINAPI SetWindowsHookEx(
__in int idHook,
__in HOOKPROC lpfn,
__in HINSTANCE hMod,
__in DWORD dwThreadId);
Sitä voidaan käyttää tietynlaisen viestien sieppausmenetelmän rekisteröintiin käyttöjärjestelmässä (Windows), esimerkiksi voimme rekisteröidä koukun, joka estää globaalit näppäimistöviestit, jotta kaikki näppäimistön painallus- ja nostotapahtumat voidaan havaita ja käsitellä (ei ole poissuljettu, etteikö viestin pudottamiseen olisi front-end-koukku).
Voimme viitata tähän funktioon C#:ssa ilmoittamalla sen näin:
[DllImport("user32.dll")] public static extern int SetWindowsHookEx( HookType idHook, HookProc lpfn, IntPtr hInstance, int threadId );
On syytä mainita, että yllä olevat HookType ja HookProc ovat omia tyyppejäni, mikä ei ole tärkeää (koska ohjelma välittää muistiosoitteen ajon aikana), mutta sen on täytettävä tietyt vaatimukset.
Funktion parametrit ylhäältä alas ovat:
idHook-tyyppi, joka tässä esitetään muotoiltuna enumina LPFN:n takaisinkutsutoiminto, kun koukut tulevat mukaan sovellusinstanssin hInstance-moduulikahva (yleensä sovellusinstanssin moduulikahva, jossa hook callback -funktio sijaitsee) threadId Säikeen tunniste, joka liittyy asennettuun hook-aliohjelmaan
Koukkuja on useita tyyppejä:
Käytämme yleensä 13:ta estääksemme näppäimistöviestit ja 14 hiiriviestien estämiseen.
Callback-funktion julistus Meidän täytyy käyttää delegaatteja C#:ssa, ja julistus on seuraava: julkinen edustaja int HookProc (int nCode, int wParam, IntPtr lParam);
Ylhäältä alas -parametri tarkoittaa, että nCode-koukkuketjun kautta takaisin kulkeva parametri, 0 tarkoittaa, että tämä viesti (edellisen viestin koukussa) hylätään, ja ei-0 tarkoittaa, että viesti on edelleen voimassa
wParam-viestiparametrit
lParam-viestiparametri
On syytä mainita, että wParam ja lParam ovat eri viestityyppejä, mutta wParam-tyypit voidaan karkeasti kuvata seuraavalla luettelolla:
lParam kapseloidaan yleensä rakenteeksi, joka vaihtelee viestityypin mukaan; seuraavat kaksi rakennetta ovat hiiren ja näppäimistön viestien lParam-rakenne:
Kun ymmärrämme yllä olevan tiedon, meillä on peruskäsitys koukkufunktioiden C#-toteutuksesta, ja kiinnitämme sitten huomiota muutamaan kysymykseen:
1. Koukut vievät paljon resursseja, ja ne tulisi peruuttaa ajoissa, kun niitä ei käytetä, mikä vaatii UnhookWindowsHookEx-funktion käyttöä
2. Kohteliaisuudesta koukun tulisi palauttaa seuraavan koukun käsittelytulos, ei pelkästään nykyisen koukun käsittelytulos (käytä CallNextHookEx-toimintoa seuraavan koukun kutsumiseen, koska koukku asetetaan ensin ja sitten aktivoituu, joten se tulisi tehdä varmistaakseen koukkuketjun normaalin toimituksen).
3. hInstance koukkufunktioparametrissa on vain siellä, missä nykyisen koukun callback-funktio on, ja oikea osoite on annettava
4. Koska delegaattia käytetään, on varmistettava, ettei delegaatin muistiosoite (viite metodiin) ole roska, muuten koukkua suoritettaessa tulee poikkeus
Voit ladata kirjoittamani esimerkkiohjelman, mutta ohjelmani vaatii seuraavat pääkohdat:
1. Estin koukkujen toteutuksen ja avasin vain näppäimistön ja hiiren viestien sieppauksen ja käsittelyn (käyttötapa on sama kuin C#:n WinForm-hiiri- ja näppäimistötapahtumissa), ja voit avata muita
2. Suunnittelin koukun singleton-tilaan, voit peruuttaa sen
3. Käyttöjärjestelmään liittyvän tietyn tunkeutumisen vuoksi virustorjuntaohjelmat voidaan raportoida riskialttiiksi
4. Koodi on huonosti kirjoitettu, pärjää sen kanssa......
Lopuksi ero ohjelmointiteknologian ja kielen välillä on se, että niiden kääntäjät ja käyttäjät ovat erilaisia, C:tä käyttävät eivät voi sanoa olevan korkeampia kuin Javaa käyttävät, eikä teknologia välttämättä näy osoittimissa, matriiseissa tai tietorakenteissa, kunhan ihmiset, jotka ymmärtävät tietokoneen periaatteet, käännös- ja käyttöjärjestelmän periaatteet jne. Tietenkin on hyvä, että jokaisella on oma suosikkikielensä ja tavalliset ohjelmointimenetelmät.
|