Запуск цикла событий 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, но теперь они, похоже, переключились обратно на низкоуровневые хуки.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector