BOOL UnhookWindowsHookEx( HHOOK hhk // handle to hook procedure to remove );
简单说明:
UnhookWindowsHookEx()函数用于从系统中卸载钩子;
hhk參数是要被卸载的钩子的句柄,也就是SetWindowsHookEx()的返回值;
最后,假设这个函数运行成功会返回非零值,假设运行失败会返回零值,用户能够通过调用GetLastError()函数获知详情。
<未完待续>
五、HOOK编程实例 1.新建一个基于对话框的project"InnerHook",此project的钩子是仅仅拦截当前进程的。 2.在OnInitDialog()中加入代码: g_hWnd = m_hWnd; g_hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId()); //设置了鼠标钩子 g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, GetCurrentThreadId()); //设置了键盘钩子 3.完毕钩子函数的编写: HHOOK g_hKeyboard=NULL; HHOOK g_hMouse; HWND g_hWnd=NULL; LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ) { return 1; } LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { //if(VK_SPACE==wParam || VK_RETURN==wParam)假设是空格键 /*if(VK_F4==wParam && (1==(lParam>>29 & 1)))拦截ALT+F4按键! return 1; else return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/ if(VK_F2==wParam)按F2时程序能够退出,这是留的后门。否则程序无法关闭,仅仅能用任务管理器来关闭它了。 { ::SendMessage(g_hWnd,WM_CLOSE,0,0); UnhookWindowsHookEx(g_hKeyboard);当程序退出时最好将钩子移除。 UnhookWindowsHookEx(g_hMouse); } return 1; } 3.编写一个屏屏蔽全部进程和全部线程的钩子程序。耸闭飧龉匙颖匦氚沧霸贒LL中,然后被某个程序调用才行。 1.新建一个DLLproject名为Hook 2.添加Hook.cpp 3.代码例如以下: #include <windows.h>包括头文件 HHOOK g_hMouse=NULL; HHOOK g_hKeyboard=NULL; #pragma data_seg("MySec")新建了一个节,用于将下 面的这个变量设为全局共享。 HWND g_hWnd=NULL;这个变量是全局共享的。 #pragma data_seg() //#pragma comment(linker,"/section:MySec,RWS") /*HINSTANCE g_hInst; BOOL WINAPI DllMain( HINSTANCE hinstDLL, // handle to the DLL module DWORD fdwReason, // reason for calling function LPVOID lpvReserved // reserved ) { g_hInst=hinstDLL; }*/ LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ) { return 1;拦截了鼠标消息。 } LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { if(VK_F2==wParam)假设是F2键,则退出。 { SendMessage(g_hWnd,WM_CLOSE,0,0); UnhookWindowsHookEx(g_hMouse);当退出时将钩子卸掉。 UnhookWindowsHookEx(g_hKeyboard); } return 1; } void SetHook(HWND hwnd)此函数设置了钩子。 { g_hWnd=hwnd;注意这样的传递调用它的进程的句柄的方法,比較巧妙! g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0); g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0); } Hook.DEF的代码例如以下: LIBRARY Hook EXPORTS SetHook @2 SEGMENTS MySec READ WRITE SHARED 也能够设置节的属性。 4.新建一个project调用此钩子函数。project名为HookTest,基于对话框的。在OnInitDialog()中调用SetHook(),要事先声明_declspec(dllimport) void SetHook(HWND hwnd); 然后在Project->Setting->Link->增加../Hook/Debug/Hook.lib,并将Hook.Dll复制到当前文件夹。 int cxScreen,cyScreen; cxScreen=GetSystemMetrics(SM_CXSCREEN); cyScreen=GetSystemMetrics(SM_CYSCREEN); SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);将窗体保持在最前面。 SetHook(m_hWnd); 5.DLL的调试方法,设置断点,然后执行时断点时,step into就可以。 <未完待续> 參考书籍: 孙鑫《VC++深入具体解释》 參考资料: http://baike.baidu.com/view/107096.html http://www.builder.com.cn/2007/1010/544588.shtml
转载于:https://www.cnblogs.com/bhlsheji/p/4372658.html
相关资源:数据结构—成绩单生成器