Я пытался разработать фоновое приложение Windows на С++ для захвата общесистемных нажатий клавиш и щелчков мыши (нет, я не пишу регистратор нажатий клавиш, просто частота нажатий клавиш!). Для этого я понял, что мне нужно использовать Windows Hooks, и я наткнулся на отличное видео, которое дало мне основы пример. К сожалению, он использует структуру QT, и по причинам лицензирования (и по другим причинам, связанным со временем) в настоящее время он мне недоступен. Все, что мне нужно сделать, это адаптировать код так, чтобы он не требовал строки «return a.exec()» (которая, как я полагаю, начинается с цикла событий).
Комментарий к видео на YouTube содержал ответ: «Для тех, кто не использует QT, просто добавьте цикл while(GetMessage(NULL, NULL, 0, 0)); вместо a.exec() цикл QT. должно работать нормально"
Но не удалось заставить это решение работать. Был бы очень признателен за помощь в выполнении приведенного ниже кода в виде цикла событий, не зависящего от инфраструктуры QT.
#include <QtCore/QCoreApplication>
#inlcude <QDebug>
#include <iostream>
#include <Windows.h>
HHOOK hHook = NULL;
using namespace std;
LRESULT CALLBACK MyLowLevelKeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
qDebug() << "A Key was pressed";
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); //need to remove this QT dependency
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
if (hHook==NULL){
qDebug() << "Hook Failed";
}
return a.exec(); //need to remove this QT dependency
}
Вот попытка (показана только main()) перезаписи с использованием цикла сообщений и удалением ссылок QT:
int main(int argc, char *argv[])
{
MSG msg = NULL;
while (GetMessage(msg, NULL, NULL, NULL)){
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
if (hHook==NULL){
qDebug() << "Hook Failed";
}
}
}