Чтобы использовать SetWindowsHookEx
в приложении с графическим интерфейсом, вы обычно хотите, чтобы в нижней строке была функция, вызываемая в вашем потоке, каждый раз, когда происходило событие.
Так, например, если я делаюпрограммное обеспечение, чтобы показать все клавиши, нажимаемые в системе, я хочу, чтобы каким-то образом мое приложение с графическим интерфейсом получило функцию AddKeyToList(int vkeycode)
, вызываемую при каждом нажатии клавиши.
Я не специалист по внутренним компонентамWindows, но если я правильно понимаю документацию, хуки, установленные SetWindowsHookEx
, вызываются в контексте потока, который вызвал событие, которое они перехватывают.Итак, чтобы сделать то, что я описал, нужно:
Создать DLL, которая будет содержать функцию ловушки, и создать там область разделяемой памяти, с которой все потоки будут совместно использовать и взаимодействовать с ней.через него друг друга.
Создайте pInvoke
подобный механизм как в функции подключения, так и в программе с графическим интерфейсом.В нашем примере функция ловушки отправит нажатую клавишу нашей программе с графическим интерфейсом, а программа с графическим интерфейсом вызовет в своем собственном контексте функцию AddKeyToList
.
Это невероятно сложно дляотносительно простой класс (сравните с расширением XRecord в мире Unix), и это может быть даже невозможно, если вы используете что-то вроде Qt
.
Есть ли какая-либо библиотека (предпочтительно с открытым исходным кодом), которая уже реализовала эти механизмы,и позволяют мне использовать «фасад», который, например, будет вызывать функцию в контексте моего потока всякий раз, когда происходит WH_KEYBOARD_LL
?
Я прав в своем анализе илиЕсть более простой способ добиться того, что я описал?
Может ли библиотека Qt
помочь мне с этой задачей?