一、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()
//设置这个新增的DLL节为所有进程共享的节
#pragma comment(linker,"/section:MySec,RWS")
/***************将新建立的节设为为共享结束*************/
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);
第十二节 钩子
原创
©著作权归作者所有:来自51CTO博客作者rosehacker2010的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
第十二节TypeScript 对象
Map.keys()与Map.values()都会获取一个迭代对象,可用于循环处理。Map对象保存键值对,并且能够记住键的原始插入顺序。任性。
typescript javascript 前端 Google 迭代 -
Python 第十节 第十二课
[toc]os 模块-文件和目录操作 我们可以通过前面讲的文件对象实现对于文件内
多级目录 目录操作 方法名 -
第十二周
sed变量引用,sudoers格式详解
sed sudoers -
Python 第二节 第十二课
[toc]字符串驻留机制和字符串比较字符串驻留: 仅保存一份相同且不可变字符串、
字符串 字符串比较 子字符串 -
第十二节:类的定义
Java高级编程掌握类的定义; 对象的定义;...
构造方法 高级编程 java 主方法 带参数