Pure C# Hook-implementatie
Om systeemhooks te implementeren is het eigenlijk heel eenvoudig: roep gewoon de drie Win32 API's aan. SetWindowsHookEx wordt gebruikt om hooks op te zetten. (Maak een kaart aan om de informatie die je nodig hebt te controleren)
CallNextHookEx wordt gebruikt om hooks door te geven (berichten zijn belangrijk, dus waar ze vandaan komen, moeten ze teruggaan naar waar je ze wilt blokkeren)
UnhookWindowsHookEx Uninstall hooks (verwijderen is erg belangrijk, te veel vastzittende instellingen zorgen voor congestie)
Het artikel "HOW TO: Setting Window Hooks in Visual C# .NET" beschrijft het als volgt: Globale hooks worden niet ondersteund in het .NET-framework Je kunt geen globale hooks implementeren in het Microsoft .NET framework. Om een globale hook te installeren, moet de hook een native dynamic link library (DLL) export hebben zodat deze in een ander proces kan worden ingevoegd dat in een geldige en consistente functie moet worden aangeroepen. Dit vereist een DLL-export, die niet wordt ondersteund door het .NET-framework. De beheerde code heeft niet het concept van een uniforme waarde voor functiepointers, omdat deze functies dynamisch geconstrueerde proxies zijn. Ik vond veel code op internet, en de meeste bevatten een C++ DLL om de DLL te identificeren met de subroutine waarnaar lpfn verwijst, wat deze bewering lijkt te bevestigen.
Maar in werkelijkheid is dit niet het geval, en kan de globale hook worden geïmplementeerd met de volgende code: IntPtr pInstance = Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly(). ManifestModule); Win32API.SetWindowsHookEx( WH_MOUSE_LL,m_MouseHookProcedure, pInstance, 0 ); Opmerking: De ManifestModule-eigenschap is een nieuwe toevoeging in .Net Framework 2.0, dus wanneer je nog steeds gebruikt. In Net Framework 1.x kun je de GetModules-methode gebruiken om alle modules van de huidige assembly te krijgen, en vervolgens één daarvan als parameter gebruiken voor de GetHINSTAN-methode om de juiste handle-pointer te krijgen.
|