当前位置:C++技术网 > 资讯 > 钩子最基本的设置方法

钩子最基本的设置方法

更新时间:2015-06-23 22:35:59浏览次数:1+次

    钩子的使用对我等屁民来说太过高深。为了方便广大和我一样啥都不会的菜鸟使用钩子,我现将钩子最基本的设置方法写出来。和网上的文章不同的是,我不会添加那些复杂的变化,不论是解释还是代码,都尽可能的短,以使读者保持思维连贯。
    本文只就当前的编译器情况做讨论(这可能使很多人觉得我在下文中一些话没有说全,但我坚持简短第一)。如果以后情况发生改变,那么以后再说。如果有一天读者用到API的时候没有奏效,不要沮丧。很可能是由于操作系统的权限限制更加严格,这条API不再能够达到预期的目的,其原有功能被分配给了其他的API。
    请注意钩子的执行顺序是后挂钩先执行。这点和atexit(函数名)一样。
    如果读者本身是大牛,可无视本文。

    此函数出自windows.h,必须先井阴可录的瘟都死点H。
    有些API出自psapi.h。用任何API前最好先查一下出自哪个类库或动态链接库。
    注:点h是c的系统类库,没有.h是C++的系统类库,使用时请斟酌。
    LPCWSTR:Long Pointer Const Wide String,长指针常量宽字节字符串。宽字节,意思是其最基本的组成单位是wchar_t而不是char。长指针,就是和普通指针一样长的指针。

SetWindowsHookEx(
    第一个参数
    第二个参数
    第三个参数
    第四个参数
)

    第一个参数:写法为WH_XXXXXX。类型。即,你希望钩子对被钩线程的哪类活动做响应。比如窗口变化活动,收发消息活动等。
    第二个参数:回调函数名字,名字前面不加返回值类型和函数类型,后面不加括号。回调函数本身就是用函数指针弄出来、调用的,响应某特定事件的处理函数。写法如下:
LRESULT  CALLBACK  FUCK(int nCode, WPARAM wParam, LPARAM lParam)
{
...................(处理)
CallNextHookEx(c, nCode, wParam, lParam);
return 0;
}

    ↑请注意CallNextHookEx的参数中,这个nCode, wParam, lParam都是直接这么打上去的,就是“nCode, wParam, lParam”,一个字母都不用改。因为这个是FUCK的局部变量。
    ↑c是HHOOK型变量。正巧,SetWindowsHookEx函数的返回值也是HHOOK型。只要将返回值赋给c即可。(注意是HHOOK而不是HOOK)

    我写的这个回调函数,函数名是FUCK。我故意不写通常的FUN或FUNC或FUNCTION,因为我希望读者可以一眼看到,不要有压力。
    第三个参数:HINSTANCE类型(等于HMODULE类型)。是应用程序载入模块的线性地址,用来区别进程。其获取方法如下:

    先获取窗口名:

HWND  GeBOldWang;
wchar_t  str1[128];
LPWSTR  str = str1;
GeBOldWang = FindWindowEx(NULL, NULL, NULL, _T("[窗口名]"));//←获取窗口句柄
GetModuleFileNameEx(GeBLaoWang, NULL, str, sizeof(str));
//↑把窗口中已加载模块的完整地址复制到字符串指针str
HMODULE  hModule = LoadLibrary(str);//←通过完整路径,知道是这个模块(此进程)文件
//FindWidowEx这个是获取窗口句柄的。我们的最终目的是确定模块(进程)文件,但进程不一定有窗口。所以第三个参数的获取过程不是固定的。

     第四个参数:线程ID,DWORD类型(数字)。第四个参数获取方法包括:

GetCurrentThreadId();  //获取当前线程ID
0            //匹配所有符合条件的线程
GetWindowThreadProcessId //返回值为线程ID(也可通过句柄获取进程ID,但我没有用到)等。总之需要获取可以使用的线程ID。

    注:钩子只有三个函数。分别是:
    SetWindowsHookEx    //设置
    CallNextHookEx      //继续
    UnhookWindowsHookEx //释放