Čista implementacija C# Hook
Za implementacijo sistemskih kljuk je pravzaprav zelo preprosto, preprosto pokliči tri Win32 API-je. SetWindowsHookEx se uporablja za nastavitev kljuk. (Nastavite kartico, da preverite potrebne informacije)
CallNextHookEx se uporablja za posredovanje hookov (sporočila so pomembna, zato naj se vrnejo tja, kjer jih želite blokirati)
Odklopi WindowsHookEx Odstrani kljuke (odstranitev je zelo pomembna, preveč zataknjenih nastavitev povzroča zastoje)
Članek "KAKO nastaviti: Nastavitev okenskih kljuk v Visual C# .NET" to opisuje takole: Globalni hooki niso podprti v .NET ogrodju V Microsoft .NET ogrodju ne moreš implementirati globalnih hookov. Za namestitev globalnega hooka mora imeti hook izvorno izvozno knjižnico dinamičnih povezav (DLL), da ga je mogoče vstaviti v drug proces, ki ga je treba poklicati v veljavno in dosledno funkcijo. To zahteva izvoz DLL, ki ga .NET ogrodje ne podpira. Upravljana koda nima koncepta enotne vrednosti za kazalce funkcij, saj so te funkcije dinamično konstruirani proxyji. Na internetu sem našel veliko kode, večina pa vsebuje C++ DLL za identifikacijo DLL-ja, ki vsebuje podprogram, na katerega se sklicuje lpfn, kar se zdi, da potrjuje to trditev.
V resnici pa temu ni tako, globalni hook pa je mogoče implementirati z naslednjo kodo: IntPtr pInstance = Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly(). ManifestModule ); Win32API.SetWindowsHookEx( WH_MOUSE_LL,m_MouseHookProcedure, pInstance, 0 ); Opomba: Lastnost ManifestModule je nova pridobitev v .Net Framework 2.0, tako da če še vedno uporabljate . V Net Framework 1.x lahko uporabite metodo GetModules za pridobitev vseh modulov trenutnega asemblerja, nato pa uporabite enega od njih kot parameter za metodo GetHINSTAN za ustrezno kazalko za ročaj.
|