全局挂钩在 Visual C++ 中不起作用

Posted

技术标签:

【中文标题】全局挂钩在 Visual C++ 中不起作用【英文标题】:Global Hooks not working in Visual C++ 【发布时间】:2015-02-19 07:53:58 【问题描述】:

我已经编写了这个基本的 C++ 应用程序来理解 Windows 全局挂钩,因为我是新手。不幸的是,这在 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();

【问题讨论】:

当前程序会设置钩子并立即终止。你的 Qt 程序是什么样子的? @trenki 完全正确!那就是问题所在。 Qt 程序看起来有点相似,我已经更新了帖子。 【参考方案1】:

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

带有return a.exec() 的Qt 应用程序运行一个消息循环,该循环只会在您关闭程序时终止。这就是它保持打开状态的原因。

编辑:

你必须“抽windows消息循环”,试试下面的代码(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 消息,您可以终止程序。

【讨论】:

那行不通。但我想我在网上找到了解决方案。让我将其发布为答案。【参考方案2】:

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

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

【讨论】:

@trenki 看看这个。

以上是关于全局挂钩在 Visual C++ 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

窗口挂钩在 Windows 7 中不起作用,但在 Windows xp 中不起作用

while 循环在 useEffect 挂钩中不起作用

为啥 DirectX Device Present 钩子在弯路中不起作用?

布局在 Visual Studio 2015 中不起作用?

tslint 在 Visual Studio 代码中不起作用

为啥 MPI 在 Visual Studio 2015 中不起作用?