gpt4 book ai didi

c++ - 全局 Hook 在 Visual C++ 中不起作用

转载 作者:搜寻专家 更新时间:2023-10-31 01:01:40 24 4
gpt4 key购买 nike

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

最佳答案

第一个应用程序将设置 Hook ,然后立即终止程序。

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 消息,您可以终止程序。

关于c++ - 全局 Hook 在 Visual C++ 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28601100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com