Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 17250|Відповідь: 0

[Чайови] Використання функцій-гачків у навичках програмування на C# - SetWindowsHookEx

[Копіювати посилання]
Опубліковано 07.02.2019 21:12:59 | | |
Як вам відомо: C# є супутньою мовою до платформи .NET Framework, і неможливо реалізувати глобальні хуки з власними бібліотеками та пропозиціями компілятора. Але на практиці виклики некерованого коду залишаються вірними в C#, використовуючи властивість DllImport для посилання на методи в бібліотеці некерованих кодів. Функції гачка існують у user32.dll, а прототип функції виглядає так:

HHOOK WINAPI SetWindowsHookEx(

__in int idHook,

__in HOOKPROC lpfn,

__in HINSTANCE hMod,

__in DWORD dwThreadId);

Його можна використовувати для реєстрації певного типу методу обробки перехоплення повідомлень в операційній системі (Windows), наприклад, ми можемо зареєструвати гачок для блокування глобальних повідомлень на клавіатурі, щоб усі події натискання та підйому клавіатури могли бути сприйняті та оброблені нами (не виключається, що існує фронтенд-гачок для скидання повідомлення).

Ми можемо посилатися на цю функцію в C#, оголосивши її так:

  [DllImport("user32.dll")]
        public static extern int SetWindowsHookEx(
            HookType idHook,
            HookProc lpfn,
            IntPtr hInstance,
            int threadId
            );

Варто зазначити, що HookType і HookProc вище — це мої власні типи, що не є важливим (оскільки програма передає адресу пам'яті під час запуску), але має відповідати певним вимогам.

Параметри функції зверху вниз такі:

  тип idHook, який тут представлений формованим enum
     Функція зворотного виклику LPFN, коли в дію вступають хуки.
     дескриптор модуля hInstance для інстансу додатку (зазвичай це дескриптор модуля екземпляра додатку, де розташована функція зворотного виклику hook)
       threadIdІдентифікатор потоку, пов'язаного з встановленою підпрограмою hook

Існує кілька типів гачків:
Зазвичай ми використовуємо 13 для блокування повідомлень з клавіатури і 14 для блокування повідомлень мишкою.

Оголошення функції зворотного виклику Потрібно використовувати делегатів у C#, і декларація виглядає так:
    публічний делегат int HookProc(int nCode, int wParam, IntPtr lParam);

Параметр зверху вниз означає, що параметр, переданий ланцюгом гачків nCode, 0 означає, що це повідомлення (через попередній хук) відкидається, а non-0 означає, що це повідомлення залишається дійсним

Параметри повідомлення wParam

Параметр повідомлення lParam

Варто зазначити, що wParam і lParam — це різні типи різних типів повідомлень, але типи wParam можна приблизно представити наступним переліченням:
lParam зазвичай інкапсулюється як структура, яка залежить від типу повідомлення, наступні дві структури — це структура lParam для повідомлень миші та клавіатури:
Коли ми розуміємо наведену інформацію, ми отримуємо базове розуміння реалізації функцій гачка в C#, а потім звертаємо увагу на кілька запитань:

1. Гачки займають багато ресурсів і повинні бути скасовані з часом, коли не використовуються, що вимагає використання функції UnhookWindowsHookEx

2. З уваги, гачок повинен повертати результат обробки наступного гачка, а не лише результат поточного гачка (використовуйте CallNextHookEx для виклику наступного гака, оскільки гачок встановлюється першим, а потім набирає чинності, тому це слід робити для забезпечення нормальної передачі ланцюга гачка).

3. Екземпляр hInstance у параметрі функції hook — це лише там, де функція зворотного виклику поточного хука, і має бути вказана правильна адреса

4. Оскільки використовується делегат, слід гарантувати, що адреса пам'яті делегата (посилання на метод) не буде сміттєвою, інакше виникне виняток при виконанні хука



Ви можете завантажити зразок програми, яку я написав, але моїй програмі потрібні такі основні пункти:

1. Я заблокував реалізацію гачків і відкрив лише перехоплення та обробку повідомлень клавіатурою та мишкою (метод використання такий самий, як у подій миші та клавіатури C# у WinForm), і ви можете відкрити інші

2. Я розробив гачок у режимі singleton, його можна скасувати

3. Через певне вторгнення в операційну систему антивірусне програмне забезпечення може вважатися ризикованим

4. Код написаний погано, просто задовольтеся цим......



Нарешті, різниця між технологіями програмування і мовою полягає в тому, що їхні компілятори та користувачі різні: людей, які використовують C, не можна вважати вищими за тих, хто користується Java, і технології не обов'язково відображаються у вказівниках, матрицях, структурах даних, якщо люди розуміють комп'ютерні принципи, компіляції, принципи операційної системи тощо. Звісно, добре, що у кожного є своя улюблена мова та звичні методи програмування.





Попередній:Реалізація чистого C# hook
Наступний:【Jiangshi WeChat Multi-Open】WeChat Scan Code Optional Login|Unlimited Multi-Open|Save Login Configuration
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com