在网上找了好久都没有找到消息hook的实例,下面是我的例子给大家分享一下下面是dll中的代码://////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //我的经验,编译的时候会提示DllMain,已在DllMain.cpp中定义,把DllMain.cpp从源文件里删掉就好了#include "stdafx.h"#include<Windows.h>HHOOK hkey=NULL;HINSTANCE h_dll;#pragma data_seg(".MySec") //定义字段,段名.MySecHWND h_wnd=NULL;#pragma data_seg()#pragma comment(linker,"/section:.MySec,RWS")BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved){h_dll=hinstDLL;// MessageBox(0,"运行dllman","",MB_OK);return TRUE;}LRESULT CALLBACK my_test(int nCode,WPARAM wParam,LPARAM iParam)//{/*if(nCode==HC_ACTION){MessageBox(0,"成功!!","标题",MB_OK);}else{MessageBox(0,"失败!!","标题",MB_OK);}*/MessageBox(0,"被截取","",MB_OK);UnhookWindowsHookEx(hkey);return 1;}void SetHook(HWND hwnd){h_wnd = hwnd;// MessageBox(0,"运行sethook","",MB_OK);hkey=SetWindowsHookEx(WH_KEYBOARD,my_test,h_dll,0);}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 下面是EXE的代码:有很多头文件是没用上的,我个人习惯都带着- -,虽然这不是好习惯//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include <windows.h>#include <sstream>#include <stdlib.h>#include <stdio.h>#include <tchar.h>#include <iostream>#include <string>#include <shlwapi.h>#include <shlobj.h>#include <wctype.h>#include <Winbase.h>#include <strsafe.h>#include <conio.h>#include <Psapi.h>#include <Tlhelp32.h>#pragma comment (lib,"PSAPI.LIB")#pragma comment (lib,"shlwapi.lib")#pragma comment (lib,"Kernel32.lib")using namespace std;typedef void (__cdecl * pfunc)(HWND); //定义函数指针类型void main(){HINSTANCE hmod;pfunc sethook;hmod=LoadLibrary("c:\dll_hook.dll");//动态加载dllif(hmod!=NULL){sethook=(pfunc)GetProcAddress(hmod,"SetHook");//调用dll中的函数sethook(NULL);}system("pause");}////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////下面是我搜集的hook相关的文档,大多来自百度首先说一句, 能够调用WIN32API的编程语言很多, 例如汇编, Fortran, VB, C, Java, 甚至脚本语言matlab, ruby等, 不过原理都是一样的, 这里就以C / C++ 来为例吧-------------------SetWindowsHookEx一般都是写在你要使用Hook的地方, 在进一步解释之前先简略说明一下Hook相关情况-------------------钩子有局部和远程两种类型, 与钩子相关的函数有:1. 建立钩子:SetWindowsHookEx, 其四个参数分别为钩子类型, 钩子函数地址, 钩子函数所在DLL的实例句柄,安装钩子后想监控的线程的ID号, 返回参数为钩子句柄2. UnhookWindowsHookEx, 参数只有一个,为要卸载的钩子句柄3. 钩子函数(名称任意), 三个参数, 具体意义与钩子类型有关这里以一个例子说明一下:比如你想写一个程序, 当鼠标移到哪里时就在主程序中显示鼠标所在窗口的名称--------------------(1)如果鼠标只是局限在窗口内, 那么以上1, 2, 3三个函数均写在运行的主程序中, 比如函数1可以写在按下某个按钮的消息响应函数中,函数2 写在松开按扭的消息响应函数中,函数3 只要不写在别的函数中就行, 因为它本生就是一个要定义的独立函数(2)如果鼠标可以在屏幕任意位置移动, 那么以上函数1, 2位置同(1), 但函数3要写在一个另外写的DLL里, 因为此时安装的是全局钩子, 为了达到获取窗口名称的目的, 在DLL里可能还要做一些其他工作,比如设置共享段, 关于这些这里不细说了------------------------关于钩子,以上只是简单说了一下, 不过, 使用钩子确实也很简单, 因为主要的工作还是在钩子函数里------------------------------------------------------------------------关于钩子的使用其实真的很简单, 应该说WIN32编程其实真的很简单, 更进一步说, 不用动脑筋写算法只用熟练语法的编程都很简单, 这里当然也包括钩子的应用啦:)说到这里忍不住发表一点题外话, 编程多年, 走过很多弯路, 体会很多, 关于编程, 其实学问很大, 小到学语法, 大到算法, 应用, 架构等等, 作为一门计算机科学, 与物理, 数学等有关系的分枝还有很多, 还有与电子相关的专业等, 内容庞杂因此, 如果你真想学点东西, 不要局限在写一个有特殊用途的桌面程序,也不要整天沉浸在各种语言,语法中, 最主要的是不要贪多! 明确自己学编程到底想做什么, 是写软件, 开发游戏, 还是搞网络, 还是做算法, 还是解决理工,数学, 电子问题打好基础,明确目标, 就好好钻研吧, 不要什么都学, 但什么都不精扯远了, 说不定你本生就已经很厉害了, 我反倒显得有些班门弄斧了, 不过都是真实体会, 不管对你有没有用, 再一次Good luck![编辑本段]语法HHOOK WINAPI SetWindowsHookEx(__in int idHook,__in HOOKPROC lpfn,__in HINSTANCE hMod,__in DWORD dwThreadId);[编辑本段]基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。
当消息到达后,在目标窗口处理函数之前处理它。
钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。
每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。
这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
--------------------------------------------------------------------------------[编辑本段]运行机制1、钩子链表和钩子子程:每一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。
这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。
当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。
一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。
最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。
Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。