在不使用QT的情况下运行C ++事件循环

时间:2015-07-29 10:02:06

标签: c++ qt hook event-loop mouse-hook

我一直在尝试用c ++开发一个后台Windows应用程序来捕获系统范围的击键和鼠标点击(不,我不是在写一个击键记录器,只是按键速率!)。为此,我发现我需要使用Windows Hooks,而我遇到了this excellent video这给了我一个基本的例子。不幸的是,它使用QT框架和许可(以及其他基于时间)的原因,目前我无法使用。  我需要做的就是调整代码,使其不需要“return a.exec()”行(我相信这是从事件循环开始的)。

对youtube视频的评论似乎有答案: “对于那些不使用QT的人,只需添加     while(GetMessage(NULL,NULL,0,0)); 而不是a.exec(),QT循环。它应该工作正常“

但无法使这个解决方案起作用。非常感谢帮助下面的代码作为事件循环执行而不依赖于QT框架。

Reds

以下是使用消息循环重新编写并删除QT引用的尝试(仅显示main()):

#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
}

1 个答案:

答案 0 :(得分: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;
}

编辑: 我最初评论说什么脉冲切换到直接输入,但现在它们似乎已经切换回低级钩子。