1 . AFX_EXT_CLASS 是什么
扩展DLL使用 AFX_EXT_CLASS 宏导出类;链接到扩展 DLL 的可执行文件使用该宏导入类。 用于生成扩展 DLL 的相同头文件可通过 AFX_EXT_CLASS 宏与链接到 DLL 的可执行文件一起使用。
在写钩子类的时候需要用到这个关键字。
参考资料:MSDN:使用AFX_EXT_CLASS 导出和导入
2. pragma是什么
它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
参考资料:#pragma 预处理指令详解
3. 定义数据段
#pragma data_seg("mydata")
// definition of data which will store in data segment "mydata"
#pragma data_seg()
5. SetWindowsHookEx 函数
函数原型:
HHOOK WINAPI SetWindowsHookEx(
__in int idHook,
__in HOOKPROC lpfn,
__in HINSTANCE hMod,
__in DWORD dwThreadId
);
函数功能:安装钩子
参数解释:
idHook: 安装的钩子类型,例如钩子用来监视鼠标消息,则值为WH_MOUSE,若用来监视键盘消息,则值为WH_KEYBOARD
lpfn: 钩子程序的处理过程,例如鼠标钩子处理过程的原型为
LRESULT CALLBACK MouseProc(
__in int nCode,
__in WPARAM wParam,
__in LPARAM lParam
);
从CALLBACK可以看出这是一个回调函数,当被监视的程序处理鼠标消息时,这个函数会被系统调用,无需我们自己调用。注意函数的名字不一定是MouseProc,但是参数类型要一致。另外,还需要注意,这个函数只能定义成普通的c函数,而不能定义成某个类的成员函数。
hMode:
dwThreadId:
dwThreadId表示钩子程序要与哪个线程相关联,如果这是一个线程钩子,用于监视本线程及其产生的线程,(例如使用GetCurrentThreadId()函数得到当前线程),那么hMode的值为0;如果这是一个系统钩子,用于监视所有指定类型消息,那么由于系统钩子必须使用独立的动态链接库,dwThreadId的值为0, hMode的值为DLL的DllMain()函数传过来的参数hinstDLL的值,
此函数原型为
BOOL WINAPI DllMain(
__in HINSTANCE hinstDLL,
__in DWORD fdwReason,
__in LPVOID lpvReserved
);
关于DLLMain,详见:MSDN: DllMain entry point
其它:
注意钩子使用完毕,要使用
UnhookWindowsHookEx函数卸载钩子。
注意钩子处理过程lpfn最后一般需要
6. 使用DLL文件时的设置
dll文件:复制到使用这个dll文件的应用程序同目录下
lib文件:以vs2010为例,右击项目 -> 属性 -> 链接器->输入->附加依赖项,将lib文件路径添加进来
注:此文不断更新
全文参考资料:
MSDN:
Using Hooks