今天将介绍一个特别的钩子程序,特别之处在于它非常简单,希望能给读者一些启发。我们不会 介绍复杂的原理,也不会涉及诸多的函数,相关的只有2个:SetWindowsHookEx 和 CBTProc 下面就对 他们分别作一介绍: HHOOK SetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId ); 第一个参数:指定钩子的类型,有WH_MOUSE、WH_KEYBOARD等十多种(具体参见MSDN)第二个参数:标识钩子函数的入口地址第三个参数:钩子函数所在模块的句柄;第四个参数:钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息。 简单理解就是第一个参数告诉系统:请将xxx的消息发给我。我们选择的是 WH_CBT 。这个类型 会在窗口激活,创建,最小化,最大化,移动或者改变大小;完成系统命令;从系统消息队列中 移除鼠标或者键盘事件之前;在取得键盘焦点之前;和系统消息队列同步之前; 设置键盘焦点之前触发。 回调函数,CBTProc 原型如下:LRESULT CALLBACK CBTProc( int nCode,WPARAM wParam,LPARAM lParam); 输入的参数 nCode = HCBT_ACTIVATE 表示是在激活一个窗口之前,回调进入这个函数的。 因此,我们所做的就是:告诉系统,我已经hook,请将窗口的某种消息发给我的xxx程序,然后 我们在xxx程序中再检查,当遇到我们需要的yyy消息时就做我们要做的,程序中我们是更换 按键上的文字。 ;MASMPlus 代码模板 - 普通的 Windows 程序代码 .386.Model Flat, StdCallOption Casemap :None Include windows.incInclude user32.incInclude kernel32.incInclude gdi32.inc includelib gdi32.libIncludeLib user32.libIncludeLib kernel32.libinclude macro.asm WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORDWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD .DATAszClassName db "MASMPlus_Class",0 .DATA?hInstance dd ?hHook dd ? .CODESTART: invoke GetModuleHandle,NULLmov hInstance,eaxinvoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULTinvoke ExitProcess,0 WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORDLOCAL wc :WNDCLASSEXLOCAL msg :MSGlocal hWnd :HWND mov wc.cbSize,sizeof WNDCLASSEXmov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOWmov wc.lpfnWndProc,offset WndProcmov wc.cbClsExtra,NULLmov wc.cbWndExtra,NULLpush hInstpop wc.hInstancemov wc.hbrBackground,COLOR_BTNFACE+1mov wc.lp