众所周知,消息传递在Windows系统中起着非常重要的作用。 另一方面,挂接是一种特殊工具,可以拦截指定窗口中的消息,然后处理消息或直接传递到下一层而不处理消息。
这个程序分为两个部分。
1.KeyboardHook.dll负责对指定窗口下的挂接执行删除挂接等操作。
2.KeyboardHookTest调用上述动态链接库,并提供交互式操作接口。
正文:
1.KeyboardHook.dll
1.1 SetHook (下挂钩程序) )
voidsethook(dworddwthreadid ) hmodulemod=getmodulehandle ) (keyboardhookdll.dll ); //当前DLL模块句柄g _ hkeyboardhook=setwindowshookex (wh _ keyboard _ ll,LowLevelKeyboardProc,mod,0 ); g_dwThreadID=dwThreadID; }代码分析:
SetWindowsHookEx原型
hookwinapisetwindowshookex (_ in _ intid hook,_In_ HOOKPROC lpfn,_In_ HINSTANCE hMod,_In_ DWORD dwThreadId )
第二个参数是挂接的回调函数
第三个参数是第二个参数表示的回调函数所在的动态链接库的句柄
第四个参数线程标识符。 0时为全局挂钩
1.2回调函数
lesultcallbacklowlevelkeyboardproc (int ncode,WPARAM wParam, 将LPARAM lParam )//键释放为单个键值if(WM_keyup===wparam ) kbdaram的postthreadmessage(g_dwthreadid,WM _ globbam } returncallnexthookex (g _ hkeyboardhook,nCode,wParam,lParam ); }wParam和lParam是消息的两个参数,指示消息的类型。
密钥上升时发送自定义消息,并在KeyboardHookTest中处理消息。
1.3删除手册
voiddeletehook ((unhookwindowshookex ) g_hkeyboardhook ); }2.KeyboardHookTest
2.1主程序
int_tmain(intargc,TCHAR* argv[],TCHAR* envp[] ) {int nRetCode=0; show window (获取控制台窗口)、SW_HIDE ); //隐藏窗口sethook(getcurrentthreadid (); MSG msg; char content[16]={0}; int a=0; while(true ) if ) peekmessage(msg,NULL,NULL,PM_REMOVE ) ) if ) WM _ global keyboard==msg.message sprind writefile(L'C:(test2.txt ',content,3 ); }}}DeleteHook (; 返回n记录码; }启动程序-隐藏窗口-下挂钩-获取键盘消息按ASCII值保存文件,ESC退出并删除挂钩
2.2写入文件
正文结束。
资源链接: http://download.csdn.net/download/Jupiter 37/9435162
注意:这个链接是原始程序,本文是在改造的程序中描述的,并不完全一致,大致相同,读者自己理解。
编程环境win7 64位、vs2010