Čistá implementace hooku v C#
Pro implementaci systémových hooků je to vlastně velmi jednoduché, stačí zavolat tři Win32 API. SetWindowsHookEx se používá k nastavení háků. (Nastavte si kartu, abyste si ověřili potřebné informace)
CallNextHookEx se používá k předávání háčků (zprávy jsou důležité, takže odkud přicházejí, měly by se vrátit tam, kde je chcete zablokovat)
Odhákejte WindowsHookEx Odinstalujte háky (odinstalace je velmi důležitá, příliš mnoho zaseknutých nastavení způsobí zahlcení)
Článek "JAK TO: Setting Window Hooks ve Visual C# .NET" jej popisuje následovně: Globální háky nejsou v .NET frameworku podporovány V Microsoft .NET frameworku nelze implementovat globální hooky. Pro instalaci globálního háku musí hák mít nativní exportovanou knihovnu dynamických linků (DLL), aby jej bylo možné vložit do jiného procesu, který je třeba volat do platné a konzistentní funkce. To vyžaduje export DLL, který .NET framework nepodporuje. Spravovaný kód nemá koncept jednotné hodnoty pro ukazatele funkcí, protože tyto funkce jsou dynamicky konstruované proxy. Našel jsem na internetu spoustu kódu a většina z nich obsahuje C++ DLL pro identifikaci DLL obsahující podprogram odkazovaný lpfn, což se zdá potvrzovat toto tvrzení.
Ve skutečnosti tomu tak však není a globální hook lze implementovat pomocí následujícího kódu: IntPtr pInstance = Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly(). ManifestModule ); Win32API.SetWindowsHookEx( WH_MOUSE_LL,m_MouseHookProcedure, pInstance, 0 ); Poznámka: Vlastnost ManifestModule je novinkou v .Net Framework 2.0, takže pokud stále používáte . V Net Framework 1.x můžete použít metodu GetModules k získání všech modulů aktuálního assembleru a pak použít jeden z nich jako parametr pro metodu GetHINSTAN pro získání příslušného ukazatele rukojeti.
|