Puhdas C# Hook -toteutus
Järjestelmäkoukkujen toteuttaminen on itse asiassa hyvin yksinkertaista, kutsu vain kolmea Win32-rajapintaa. SetWindowsHookEx toimii koukkujen asettamiseen. (Aseta kortti tarkistaaksesi tarvitsemasi tiedot)
CallNextHookExia käytetään hookien välittämiseen (viestit ovat tärkeitä, joten mistä ne tulevat, niiden pitäisi palata sinne, mistä haluat estää ne)
Irrota WindowsHookEx Poista koukut (poistaminen on todella tärkeää, liian monta jumittuneen asetusta aiheuttaa ruuhkaa)
Artikkeli "HOW TO: Setting Window Hooks in Visual C# .NET" kuvaa asiaa seuraavasti: Globaaleja hookeja ei tueta .NET-kehyksessä Et voi toteuttaa globaaleja hookeja Microsoft .NET -kehyksessä. Globaalin koukun asentamiseksi koukussa täytyy olla natiivi dynaaminen linkkikirjasto (DLL), jotta se voidaan lisätä toiseen prosessiin, joka täytyy kutsua kelvolliseksi ja johdonmukaiseksi funktioksi. Tämä vaatii DLL-viennin, jota .NET-kehys ei tue. Hallitulla koodilla ei ole käsitettä, että funktioosoittimilla olisi yhtenäistä arvoa, koska nämä funktiot ovat dynaamisesti rakennettuja välityspalvelijoita. Löysin paljon koodia internetistä, ja useimmissa niistä on C++ DLL, jolla tunnistetaan DLL, joka sisältää lpfn:n viittaaman aliohjelman, mikä näyttää vahvistavan tämän väitteen.
Mutta todellisuudessa näin ei ole, ja globaali koukku voidaan toteuttaa seuraavalla koodilla: IntPtr pInstance = Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly(). ManifestModule ); Win32API.SetWindowsHookEx( WH_MOUSE_LL,m_MouseHookProcedure, pInstance, 0); Huomautus: ManifestModule-ominaisuus on uusi lisäys .Net Framework 2.0:aan, joten kun käytät vielä . Net Framework 1.x:ssä voit käyttää GetModules-metodia saadaksesi kaikki nykyisen assemblyn moduulit, ja käyttää yhtä niistä parametrina GetHINSTAN-metodille saadaksesi sopivan kahvaosoittimen.
|