python钩子函数教学 钩子函数使用场景( 二 )


wParam:键盘敲打所产生的键盘消息 , 键盘按键的虚拟代码 。
lParam:包含了消息细节 。
注意:如果钩子进程中nCode小于零,钩子进程必须返回(return) CallNextHookEx(nCode,wParam,lParam);而钩子进程中的nCode大于零,但是钩子进程并不处理消息,作者推荐你调用CallNextHookEx并且返回该函数的返回值 。否则,如果另一个应用程序也装入WH_KEYBOARD 钩子,那么该钩子将不接受钩子通知并且返回一个不正确的值 。如果钩子进程处理了消息,它可能返回一个非零值去阻止系统传递该信息到其它剩下的钩子或者windows进程 。所以最好在钩子进程的最后都返回CallNextHookEx的返回值 。
IV:调用下一个钩子函数
调用下一个钩子函数时使用CallNexHookEx函数 。
原形:LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam )
CallNexHookEx()函数用于对当前钩子链中的下一个钩子进程传递钩子信息,一个钩子进程既可以在钩子信息处理前,也可以在钩子信息处理后调用该函数 。为什么使用该函数已在iii钩子进程中的“注意”中,加以了详细的说明 。
hhk: 当前钩子的句柄
nCode: 传送到钩子进程的钩子代码 。
wParam:传送到钩子进程的值 。
lParam:传送到钩子进程的值 。
参数:
hhk: 当前钩子的句柄. 应用程序接受这个句柄,作为先前调用SetWindowsHookE函数的结果
nCode: 传送到钩子进程的钩子代码,下一个钩子进程使用这个代码以此决定如何处理钩子信息
wParam:传送给钩子进程的wParam 参数值,参数值的具体含义与当前钩子链的挂接的钩子类型有关
lParam : 传送给钩子进程的wParam 参数值,参数值的具体含义与当前钩子链的挂接的钩子类型有关
返回值:返回值是链中下一个钩子进程返回的值,当前钩子进程必须返回这个值,返回值的具体含义与挂接的钩子类型有关,详细信息请参看具体的钩子进程描述 。
V 建立一个动态连接库(DLL)
当我们熟悉了以上的各个函数后,现在我们开始编写一个动态连接库(DLL) 。在这儿我采用的是WIN32 DLL,而不是MFC DLL 。而且以下所有的程序也都是采用C语言去编写 。这主要是因为使用WIN32 API能够更详细、更全面的控制程序的如何执行,而使用MFC,一些低级的控制是不可能实现的(当然,仅对该程序来说,也是可以使用MFC的) 。
1:建立一个动态连接库的.cpp文件 。比如我们现在建立一个名为hookdll.cpp的文件 。在hookdll.cpp的文件中加上如下内容:
#include windows.h
#include "string.h"
#include "stdio.h"
HINSTANCE hInst;
#pragma data_seg("hookdata")
HHOOK oldkeyhook=0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:hookdata,RWS")
#define DllExport extern "C"__declspec(dllexport)
DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );
DllExport void InstallHook(int nCode);
DllExport void EndHook(void);
BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed)
{
switch(What)
{
case DLL_PROCESS_ATTACH:
hInst = hInstance;
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}
void InstallHook(int nCode)
{
oldkeyhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hInst,0);
}
DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam )
{
WPARAM j;
FILE *fp;
if(lParam0x80000000)
{
j = wParam;
fp=fopen("c:\hook\key.txt","a");
fprintf(fp,"%4d",j);
fclose(fp);
}

推荐阅读