Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 17250|Vastaus: 0

[Vinkkejä] Koukkufunktioiden käyttö C#-ohjelmointitaidoissa - SetWindowsHookEx

[Kopioi linkki]
Julkaistu 7.2.2019 21.12.59 | | |
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.





Edellinen:Puhdas C#-koukkutoteutus
Seuraava:【Jiangshi WeChat Multi-Open】WeChat Skannauskoodi Valinnainen kirjautuminen|Rajoittamaton Multi-Open|Tallenna kirjautumisen konfiguraatio
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com