Tiszta C# Hook megvalósítás
A rendszerhorgók megvalósításához valójában nagyon egyszerű: csak hívjuk a három Win32 API-t. A SetWindowsHookEx a hookok beállítására szolgál. (Állíts be egy kártyát, hogy ellenőrizd a szükséges információkat)
A CallNextHookEx-et a hookok továbbítására használják (az üzenetek fontosak, így honnan jönnek, vissza kell menniük oda, ahol blokkolni szeretnéd őket).
UnHookWindowsHookEx Eltávolítsa a hookokat (az eltávolítás nagyon fontos, túl sok elragadt beállítás torlódást okoz)
A "HOGYAN TO: Ablakhorogok beállítása Visual C# .NET-ben" című cikk a következőképpen írja le: A globális hookok nem támogatottak a .NET keretrendszerben A Microsoft .NET keretrendszerben nem lehet globális hookokat megvalósítani. A globális hook telepítéséhez a hooknak natív dinamikus link könyvtár (DLL) exporttal kell rendelkeznie, hogy beilleszthető egy másik folyamatba, amelyet érvényes és konzisztens függvénybe kell hívni. Ez DLL exportot igényel, amit a .NET keretrendszer nem támogat. A menedzselt kódnak nincs egységes értéke a függvénymutatóknak, mert ezek a függvények dinamikusan felépített proxyk. Sok kódot találtam az interneten, és a legtöbben van egy C++ DLL, amely azonosítja azt a DLL-t, amely tartalmazza az lpfn által említett alprogramot, ami úgy tűnik, megerősíti ezt az állítást.
De a valóságban ez nem így van, és a globális hook a következő kóddal valósítható meg: IntPtr pInstance = Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly(). ManifestModule ); Win32API.SetWindowsHookEx( WH_MOUSE_LL,m_MouseHookProcedure, pInstance, 0); Megjegyzés: A ManifestModule tulajdonság egy új kiadvány a .Net Framework 2.0-ban, így amikor még mindig használod . A Net Framework 1.x-ben a GetModules metóduszot használhatod, hogy megszerezd az aktuális assembly összes modulját, majd az egyiket használhatod paraméterként a GetHINSTAN metódushoz, hogy megkapd a megfelelő handle mutatót.
|