Запуск цикла событий C++ БЕЗ использования QT
Я пытался разработать фоновое приложение для Windows на C++, чтобы фиксировать нажатия клавиш и щелчков мыши всей системы (нет, я не пишу регистратор нажатий клавиш, просто скорость нажатия клавиш!). Для этого я понял, что мне нужно использовать 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";
}
}
}
1 ответ
Это образец, который работает.
#include <Windows.h>
#include <stdlib.h>
#include <iostream>
HHOOK g_hHook = NULL;
DWORD g_HookThread;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PKBDLLHOOKSTRUCT hookstruct = reinterpret_cast<PKBDLLHOOKSTRUCT>(lParam);
std::cout << hookstruct->vkCode << std::endl;
if( wParam == WM_KEYUP ) {
if( hookstruct->vkCode == VK_ESCAPE ) {
PostThreadMessage( g_HookThread, WM_QUIT, NULL, NULL );
}
}
return CallNextHookEx( g_hHook, nCode, wParam, lParam );
}
int main()
{
g_HookThread = GetCurrentThreadId();
g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
MSG msg;
while( GetMessage(&msg, NULL, NULL, NULL) ) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(g_hHook);
return 0;
}
редактирование: я первоначально прокомментировал, что whatpulse переключился на directinput, но теперь они, кажется, переключились обратно на низкоуровневые хуки.