我已经编写了这个基本的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();
}
答案 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));