一、HOOK编程基本知识
HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);
参数:idHook: 指定将要安装的钩子过程的类型。
lpfn: 指向相应的钩子过程。如果参数dwThreadId为0,或者指定了一个其他进程创建的线程之标识符,那么
参数lpfun必须指向一个位于某动态链接库中的钩子过程。否则,参数lpfn可以指向当前进程相关的代码
中定义的一个钩子过程。
hMod: 指定lpfn指向的钩子过程所在的DLL的句柄。如果参数dwThreadId指定的线程由当前进程创建,并且相应
的钩子过程定义于与当前进程相关的代码中,那么必须将参数hMod设置为NULL。
dwThread: 指定与钩子过程相关的线程标识。如果其职为0,那么安装的钩子过程将与桌面上运行的所有线程都相关。
1、进程内钩子
鼠标钩子:
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
return 1;
}
HHOOK g_hMouse=NULL;
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
键盘钩子:
参数wParam是产生当前按键消息的键盘按键的虚拟键代码,这是Windows定义的与设备无关的,键盘按键的代码。当按下键盘上
的按键时,它实际上发送的是一个脉冲信号,Windows定义了一些虚拟键代码来表示这些信号,并由键盘设备驱动程序负责解释。
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (VK_SPACE==wParam) //过滤空格键
if(VK_F4==wParam && (1==(lParam>>29 &1))) //过滤Alt+F4组合键
return 1;
else
retrun CallNextHookEx(g_hKeyBoard,code,wParam,lParam);
if(VK_F2==wParam)
{
::SendMessage(g_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hKeyboard);
UnhookWindowsHookEx(g_hMouse);
}
return 1;
}
HHOOK g_hKeyboard=NULL;
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
2、全局钩子
DEF文件内容
LIBRARY Hook
EXPORTS
SetHook @2 //修改函数的默认编号
SEGMENTS //DLL增加新节
MySec READ WRITE SHARED //设置新增节的权限
HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;
HWND g_hWnd; //实现不了DLL中全局变量数据共享,如果想实现DLL全局变量数据共享则如下:
/*******************************将新建立的节设为为共享************************************/
#pragma data_seg("MySec") //给DLL增加新的节,MySec最大长度是8个
HWND g_hWnd=NULL; //该变量必须初始化
#pragma data_seg()
#pragma comment(linker,"/section:MySec,RWS") //设置这个新增的DLL节为所有进程共享的节
/*******************************将新建立的节设为为共享结束*******************************/
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
return 1;
}
LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(VK_F2==wParam)
{
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,MouseProc,GetModuleHandle("Hook"),0);
}
客户端实习
_declspec(dllimport) void SetHook(HWND hwnd);
SetHook(m_hWnd);
