中易网

MFC WH_GETMESSAGE全局钩子记录不了键盘消息吗?

答案:3  悬赏:60  
解决时间 2021-03-08 13:58
我把这个钩子放在DLL中,但是只能记录启动了这个钩子的那个程序中输入的键盘消息,在桌面下或者其他应用程序下,键盘消息都记录不了!!!这是为什么呀?我的DLL代码如下:
#include
#include
#include

#include

#define _WIN32_WINNT 0x0500
#pragma data_seg( "abcd")
HHOOK H_HOOK;
HINSTANCE g_hInstance = NULL; // 模块实例句柄
#pragma data_seg()
#pragma comment(linker,"/section:abcd,rws")

//static HHOOK H_HOOK;
static HANDLE hFile;
static const myMessage=1124; // 自定义消息号
static HWND hWndMain; // MainForm句柄
static const SecondPar=1; // 自定义消息第2参数
static HFILE hfile_test;
static EVENTMSG keyMSG;
//static HINSTANCE g_hInstance = NULL; // 模块实例句柄

static int key_num=0;
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
// 保存模块实例句柄
g_hInstance = (HINSTANCE)hModule;
// 在进程结束或线程结束时卸载钩子
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_PROCESS_DETACH:
case DLL_THREAD_DETACH:
if (H_HOOK != NULL) UnhookWindowsHookEx(H_HOOK);
break;
}
return TRUE;
}

DWORD writetofile(HANDLE hfile,char* lpstr)
{
DWORD dwWrites; //写入数据 char *test1 = "试验试验试验试验";
SetFilePointer(hfile,NULL,NULL,FILE_END);
BOOL succ_this = WriteFile(hfile,lpstr,strlen(lpstr),&dwWrites,NULL);
DWORD dwError = GetLastError();
return dwWrites;
}

LRESULT CALLBACK GetMsgProc(
int code, // hook code
WPARAM wParam, // removal flag
LPARAM lParam // address of structure with message
)
{
LPMSG msg = (LPMSG)lParam;
COPYDATASTRUCT cpdata;

if((msg->message==WM_KEYUP)||(msg->message==WM_CHAR)||(msg->message==WM_KEYDOWN)||(msg->message==WM_IME_CHAR)||(msg->message==WM_IME_COMPOSITION))
{
key_num++;
//把完整的信息写入文件
char buffer[200];

DWORD dwWrites;

int strlen;
strlen = sprintf(buffer, "hwnd : h%x\r\n",msg->hwnd);
strlen += sprintf(buffer+strlen,"message : h%x\r\n",msg->message);
strlen += sprintf(buffer+strlen,"wParam : h%x\r\n",msg->wParam);
strlen += sprintf(buffer+strlen,"lParam : h%x\r\n",msg->lParam);
strlen += sprintf(buffer+strlen,"time : h%x\r\n",msg->time);
strlen += sprintf(buffer+strlen,"pt.x : h%x\r\n",msg->pt.x);
strlen += sprintf(buffer+strlen,"pt.y : h%x\r\n\n\n\n",msg->pt.y);
dwWrites = writetofile(hFile,buffer);

cpdata.dwData = key_num ;
cpdata.cbData = sizeof(*msg);
cpdata.lpData = msg;

SendMessage(hWndMain,WM_COPYDATA,NULL,(LPARAM)&cpdata);
}
return 1;
}

上面还有最后一点代码没有贴出来:
BOOL WINAPI sethook(HWND hMainWin) {
hWndMain = hMainWin;
if (H_HOOK!=NULL) return TRUE;
hFile=CreateFile("d://log.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); //接受实际写入的字节数
H_HOOK = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, g_hInstance, 0);
if (H_HOOK == NULL) return FALSE;
return TRUE;
}

我知道记录键盘消息可以不用这个钩子,可以用其他钩子,但是我一是想学习一下这种钩子,二是这种钩子能将完整消息给我呈现出来,譬如句柄什么的。按道理说这种钩子可以记录键盘消息, 但实际上为什么就不能呢????
哪位大侠帮一下我吧
我实在是没有思路了,都不知道怎么尝试了!
哪位大侠帮我一下啊!!!
为什么完全没有有用的回答!!!!!!!!!
最佳答案
我之前琢磨按键精灵时写过 现在忘了 可能2个原因 1钩子类型错了 2勾到的信息要在系统处理消息函数之前处理
全部回答
数据有没有被保护啊?
你好! 创建的文件句柄应该也加到共享节中,并初始为NULL,我想就OK了 仅代表个人观点,不喜勿喷,谢谢。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
移动营业厅手机卖场 大堂经理主要做什么工作?
我家是北方的想开个小加工厂,不知道南方的朋
出险了,定损后自己修车发票怎么开
有一个长方体,相交于同一个顶点的三个面的面
饰派卫浴地址有知道的么?有点事想过去
达连村卫生所地址在哪,我要去那里办事
玻璃杯子怎么清洗比较干净,简便的方法
关于车膜的问题
哪些论坛是女生最爱去的?
共阴数码管驱动用74hc164级联做位选扩展多位
长富花园南门怎么去啊,有知道地址的么
家庭影院7.1声道,如何摆放?
【医疗】金嗓子喉片吃多了胃难受怎么办
我想开个土猪肉店,请问怎么加盟
潮州枫溪跟饶平是同一个县吗?
推荐资讯
香港兴利家具直销店嘉禾店地址在什么地方,想
如何天天都能赚到1000块钱?
维生素e160粒和维生素c90粒装多少钱一合
酒窝·清吧地址有知道的么?有点事想过去
想知道: 焦作市 从孟州市到沁阳市怎么坐公交
电脑高手来!浏览器不能显示网页内选项卡
徐州到云台山跟团有非周末发团的吗
我的手机不能打特殊符号,谁把全部特殊符号打
从父亲那里过户车子算二手车吗
起重机起吊满负荷或接近满负荷时,应先将重物
天顺居饭店地址在什么地方,想过去办事
天津吉海船务代理有限公司这个地址在什么地方
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?