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

Другие вопросы по тегам