Implementare pură C# Hook
Pentru a implementa cârligele de sistem, este de fapt foarte simplu, doar să apelezi cele trei API-uri Win32. SetWindowsHookEx este folosit pentru a configura hook-uri. (Setează un card pentru a verifica informațiile de care ai nevoie)
CallNextHookEx este folosit pentru a transmite hook-uri (mesajele sunt importante, așa că de unde provin ar trebui să se întoarcă acolo unde vrei să le blochezi)
UnhookWindowsHookEx Dezinstalează hook-urile (dezinstalarea este foarte importantă, prea multe setări blocate vor cauza congestie)
Articolul "HOW TO: Setting Window Hooks in Visual C# .NET" o descrie astfel: Hook-urile globale nu sunt suportate în cadrul .NET Nu poți implementa hook-uri globale în cadrul Microsoft .NET. Pentru a instala un hook global, hook-ul trebuie să aibă un export nativ de bibliotecă de legături dinamice (DLL), astfel încât să poată fi inserat într-un alt proces care trebuie apelat într-o funcție validă și consistentă. Aceasta necesită un export DLL, care nu este suportat de framework-ul .NET. Codul gestionat nu are conceptul de a avea o valoare uniformă pentru pointerii de funcție, deoarece aceste funcții sunt proxy-uri construite dinamic. Am găsit mult cod pe Internet, iar majoritatea conțin un DLL C++ pentru a identifica DLL-ul care conține subrutina la care face referire lpfn, ceea ce pare să valideze această afirmație.
Dar, în realitate, acest lucru nu este cazul, iar cârligul global poate fi implementat folosind următorul cod: IntPtr pInstance = Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly(). ManifestModule ); Win32API.SetWindowsHookEx( WH_MOUSE_LL,m_MouseHookProcedure, pInstance, 0 ); Notă: Proprietatea ManifestModule este o adăugire nouă în .Net Framework 2.0, așa că atunci când încă folosești . În Net Framework 1.x, poți folosi metoda GetModules pentru a obține toate modulele din ansamblul curent, apoi să folosești unul dintre ele ca parametru pentru metoda GetHINSTAN pentru a obține handlerul corespunzător.
|