сделать `SetWindowsHookEx` вызывать функции в контексте моего потока - PullRequest
0 голосов
/ 18 июня 2010

Чтобы использовать SetWindowsHookEx в приложении с графическим интерфейсом, вы обычно хотите, чтобы в нижней строке была функция, вызываемая в вашем потоке, каждый раз, когда происходило событие.

Так, например, если я делаюпрограммное обеспечение, чтобы показать все клавиши, нажимаемые в системе, я хочу, чтобы каким-то образом мое приложение с графическим интерфейсом получило функцию AddKeyToList(int vkeycode), вызываемую при каждом нажатии клавиши.

Я не специалист по внутренним компонентамWindows, но если я правильно понимаю документацию, хуки, установленные SetWindowsHookEx, вызываются в контексте потока, который вызвал событие, которое они перехватывают.Итак, чтобы сделать то, что я описал, нужно:

  1. Создать DLL, которая будет содержать функцию ловушки, и создать там область разделяемой памяти, с которой все потоки будут совместно использовать и взаимодействовать с ней.через него друг друга.

  2. Создайте pInvoke подобный механизм как в функции подключения, так и в программе с графическим интерфейсом.В нашем примере функция ловушки отправит нажатую клавишу нашей программе с графическим интерфейсом, а программа с графическим интерфейсом вызовет в своем собственном контексте функцию AddKeyToList.

Это невероятно сложно дляотносительно простой класс (сравните с расширением XRecord в мире Unix), и это может быть даже невозможно, если вы используете что-то вроде Qt.

Есть ли какая-либо библиотека (предпочтительно с открытым исходным кодом), которая уже реализовала эти механизмы,и позволяют мне использовать «фасад», который, например, будет вызывать функцию в контексте моего потока всякий раз, когда происходит WH_KEYBOARD_LL?

Я прав в своем анализе илиЕсть более простой способ добиться того, что я описал?

Может ли библиотека Qt помочь мне с этой задачей?

1 Ответ

1 голос
/ 18 июня 2010

Это поведение по умолчанию для ловушки WH_KEYBOARD_LL. Обратный вызов вызывается в том же потоке, который вызывал SetWindowsHookEx (). Этот поток должен также прокачать цикл сообщений, чтобы он работал должным образом, автоматически, когда вы используете свой поток пользовательского интерфейса. И код обратного вызова также не должен присутствовать в DLL, это не глобальный хук, который требует внедрения DLL.

Никакой дополнительной работы не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...