Чистая реализация крюка на C#
Чтобы реализовать системные крючки, на самом деле всё очень просто: просто вызваните три API Win32. SetWindowsHookEx используется для настройки хуков. (Оформите карту, чтобы проверить нужную информацию)
CallNextHookEx используется для передачи хуков (сообщения важны, поэтому откуда они приходят, они должны возвращаться туда, где вы хотите их заблокировать)
UnhookWindowsHookEx Удалить крючки (удаление очень важно, слишком много зависших настроек приведёт к засорам)
Статья «КАК СДЕЛАТЬ: Установка оконных крючков в Visual C# .NET» описывает это следующим образом: Глобальные крючки не поддерживаются в .NET-фреймворке Глобальные хуки нельзя реализовать в фреймворке Microsoft .NET. Для установки глобального хука хук должен иметь нативный экспорт из динамической библиотеки связей (DLL), чтобы его можно было вставить в другой процесс, который необходимо вызвать в валидную и согласованную функцию. Для этого требуется экспорт DLL, который не поддерживается фреймворком .NET. Управляемый код не имеет концепции единого значения для указателей функций, потому что эти функции являются динамически построенными прокси. Я нашёл много кода в интернете, и большинство из них содержат C++ DLL для идентификации DLL, содержащего подпрограмму, на которую ссылается lpfn, что, похоже, подтверждает это утверждение.
Но на самом деле это не так, и глобальный крюк можно реализовать с помощью следующего кода: IntPtr pInstance = Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly(). ManifestModule ); Win32API.SetWindowsHookEx( WH_MOUSE_LL,m_MouseHookProcedure, pInstance, 0 ); Примечание: свойство ManifestModule — это новое дополнение в .Net Framework 2.0, поэтому когда вы всё ещё используете . В Net Framework 1.x можно использовать метод GetModules, чтобы получить все модули текущей ассембли, а затем использовать один из них как параметр для метода GetHINSTAN для получения нужного указателя на дескриптор.
|