我试图做一个简单的键盘测试,但我的程序没有按预期工作,我不知道为什么。如何添加一个钩子到键盘(HookProc)
在我的程序中,我有一个低级别的键盘挂钩,并附加一个简单的过程。该过程只是打开/创建一个文件并写入“Hello World”,然后关闭。但是它不会创建该文件,可能是因为我的进程不正确,或者因为我的钩子没有正确建立。
代码:
#include<windows.h>
#include<stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam){
ofstream myfile;
myfile.open ("[PATH]/example.txt");
myfile << "Hello world";//((KBDLLHOOKSTRUCT *)lParam)->vkCode
myfile.close();
return CallNextHookEx(NULL,code,wParam,lParam);
}
int main(void){
HINSTANCE hInst = NULL;
HHOOK hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInst, 0);
printf("HHOOK is not null: %s\n", (hHook != NULL) ? "True" : "False");
char q;
for (cout << "q to quit\n"; q != 'q'; cin >> q);
printf("Successfully unhooked: %s", UnhookWindowsHookEx(hHook) ? "True" : "False");
}
解决方案我需要一个消息循环添加到主功能:
LPMSG Msg;
while(GetMessage(Msg, NULL, 0, 0) > 0)
{
TranslateMessage(Msg);
DispatchMessage(Msg);
}
检查调用'SetWindowsHookEx'的结果。从MSDN引用:“如果函数失败,返回值为NULL。要获得扩展错误信息,请调用GetLastError。” – bialpio 2014-11-21 20:56:06
它不为空,我会更新代码,使其包含检查 – Alter 2014-11-21 20:59:20
您的解决方案有一个大内存问题!您正在使用指向MSG的指针,但您没有分配内存来存储它。你最好使用:MSG Msg;并将它的指针传递给每个函数(即&Msg) – cabbi 2014-11-22 05:52:26