Реалізація чистого C# Hook
Щоб реалізувати системні хуки, це насправді дуже просто — просто зателефонуйте трьома API Win32. SetWindowsHookEx використовується для налаштування хуків. (Оформіть картку для перевірки потрібної інформації)
CallNextHookEx використовується для передачі хуків (повідомлення важливі, тому там, звідки вони надходять, вони мають повертатися туди, де ви хочете їх заблокувати)
Відключіть WindowsHookEx Видалення гачків (видалення дуже важливо, занадто багато застряглих налаштувань призведе до перевантаження)
Стаття «ЯК ЗРОБИТИ: Встановлення віконних гачків у 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, щоб отримати відповідний вказівник на handle.
|