Запуск цикла событий C++ БЕЗ использования QT

Я пытался разработать фоновое приложение 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";
    }

   }
}

person Tommy    schedule 29.07.2015    source источник
comment
цикл сообщений WinAPI немного сложнее. Может проблема в нем.   -  person Amartel    schedule 29.07.2015
comment
Вы все еще используете функции QT...   -  person Mark Jansen    schedule 29.07.2015
comment
@Amartel Спасибо - почитаю об этом дальше   -  person Tommy    schedule 29.07.2015
comment
@MarkJansen - не уверен, является ли ваш комментарий ответом на мой первоначальный вопрос или ответом на комментарий Amartel. Если это ответ на мой первоначальный вопрос - прочитайте еще раз - код, который я вставил, является примером того, что мне нужно изменить. Это пример рабочего кода, который мне нужно адаптировать. Я не знаю, как сделать это яснее.   -  person Tommy    schedule 29.07.2015
comment
Я ожидал, что вы, по крайней мере, покажете попытку переписать его с помощью цикла сообщений, отсюда и мое замешательство.   -  person Mark Jansen    schedule 29.07.2015


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

person Mark Jansen    schedule 29.07.2015
comment
Спасибо за ответ, Марк - я попробую это, но одна вещь, которая меня смущает, это то, что нет основной функции, поэтому я не уверен, где находится точка входа. - person Tommy; 29.07.2015
comment
Там я переименовал test в main. Код пришел прямо из моего рабочего приложения. - person Mark Jansen; 29.07.2015
comment
Шикарный Марк! Это отрывает меня от земли. Спасибо - person Tommy; 29.07.2015
comment
P.S. Всем, кто использует приведенный выше код Марка. Включите следующие заголовки: #include ‹windows.h› #include ‹stdlib.h› #include ‹iostream› - person Tommy; 29.07.2015