Global Hooks无法在Visual C ++中使用

时间:2015-02-19 07:53:59

标签: c++ qt setwindowshookex

我已经编写了这个基本的C ++应用程序,用于理解Windows Global Hooks,因为我刚接触它。不幸的是,这在Qt Creator上非常完美,但在Visual Studio中效果不是很好。事实上,它在VS2013中没有任何作用。有谁可以详细说明原因?这真的很有帮助!

#include <iostream>
#include <fstream>
#include <Windows.h>
#pragma comment(lib, "user32.lib")

HHOOK hHook{ NULL };

LRESULT CALLBACK MyLowLevelKeyBoardProc(const int nCode, const WPARAM wParam, const LPARAM lParam)
{
    std::cout << "Key Pressed!";
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

int main(int argc, char* argv[])
{
    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
    if (hHook == NULL) {
        std::cout << "Hook failed!" << std::endl;
    }

    return 0;
}

我已经按照教程given here进行了操作。我也尝试过咨询很多在线文档,但我无法解决它,因为我通常使用C#而不是C ++。

更新:以下是Qt应用程序的外观。它几乎相同,只是主要功能有点不同,std :: cout被QDebug()取代。还有一些额外的#include。

#include<QtCore/QCoreApplicaton>
#include<QDebug>
#include<QTime>
#include<QChar>

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
    if (hHook == NULL) {
        QDebug() << "Hook failed!";
    }

    return a.exec();
}

2 个答案:

答案 0 :(得分:3)

第一个应用程序将设置挂钩但随后立即终止程序。

使用return a.exec()的Qt应用程序运行一个消息循环,该循环仅在您关闭程序时终止。这就是它保持开放的原因。

修改

您必须&#34;抽取Windows消息循环&#34;,尝试以下代码(from wikipedia

MSG msg;
BOOL bRet;

while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
    if(bRet == -1)
    {
        // Handle Error
    }
    else
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

如果您收到WM_QUIT消息,则可以终止该程序。

答案 1 :(得分:1)

另一种更简单,更简单的方法是将以下代码行放在return语句之前。

while (GetMessage(NULL, NULL, 0, 0));