Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 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, который здесь представлен формированным энумом
     функция обратного вызова LPFN, когда в игру вступают крючки
     дескриптор модуля hInstance для экземпляра приложения (обычно это дескриптор модуля экземпляра приложения, где находится функция обратного вызова хука)
       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. Я спроектировал крючок в режиме синглтона, его можно отменить

3. Из-за определённого вторжения в операционную систему антивирусное программное обеспечение может считаться рискованным

4. Код написан плохо, просто смиритесь с ним......



Наконец, разница между технологией программирования и языком в том, что их компиляторы и пользователи разные, нельзя считать тех, кто использует C, выше тех, кто использует Java, и технологии не обязательно отражаются в указателях, матрицах, структурах данных, если люди понимают принципы компьютера, принципы компиляции, принципы операционной системы и т.. Конечно, хорошо, что у каждого свой любимый язык и обычные методы программирования.





Предыдущий:Чистая реализация крючка на C#
Следующий:【Jiangshi WeChat Multi-Open】WeChat Scan Code Optional Login|Unlimited Multi-Open|Save Login Configuration
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com