搜了不少关于钩子的帖子.. 但动手试着做时发现有几个问题还是没有搞清楚!
1. SetWindowsHookEx和UnhookWindowsHookEx是放在钩子DLL中, 还是放在调用钩子的应用程序中?放在哪里比较好?
2. 钩子函数HOOK( nCode, wparam, lparam )三个参数是什么意思?
3. 下面2种定义HHOOK的区别是什么?什么时候用第一种, 什么时候要用第二种?
 
#pragma   data_seg("mydata")   
HHOOK   hHook=NULL;     
#pragma   data_seg()HHOOK   hHook=NULL;

解决方案 »

  1.   

    前一种:数据共享
    第二种:只是dll内可用
      

  2.   

    1. SetWindowsHookEx和UnhookWindowsHookEx是放在钩子DLL中, 还是放在调用钩子的应用程序中?放在哪里比较好? 
    都可以,通常放在DLL中。2. 钩子函数HOOK( nCode, wparam, lparam )三个参数是什么意思? 
    Hook ID不同,其含义也不同,查看MSDN中各种ID的说明。3. 下面2种定义HHOOK的区别是什么?什么时候用第一种, 什么时候要用第二种? 
    全局Hook用第1种,因为全局Hook会在很多不同的进程中被调用,需要用共享数据,否则只有加载Hook的进程中才能得到真正的数据。
      

  3.   

    1, 全局钩子放dll中, 局部则在应用程序中。
    2, HOOK( nCode, wparam, lparam ) //参数的含义在不同的钩子过程中是不一样的。
    第一个一般是识别码, 后两个参数可以理解为消息函数的参数, 变化比较大。
    3. 一般是用第二种比较多。 #pragma data_seg()一般用于DLL中。也就是说,在DLL中定义一个共享的,有名字的数据段。
      

  4.   

    1, 全局钩子放dll中, 局部则在应用程序中。
    2, HOOK( nCode, wparam, lparam ) //参数的含义在不同的钩子过程中是不一样的。
    第一个一般是识别码, 后两个参数可以理解为消息函数的参数, 变化比较大。
    3. 一般是用第二种比较多。 #pragma data_seg()一般用于DLL中。也就是说,在DLL中定义一个共享的,有名字的数据段。
      

  5.   

    一般都放DLL中,你看很多皮肤库,他们就用到了钩子,勾住本进程,而他们都是放在DLL中的
      

  6.   

    谢谢大家 ! 
          刚吃完饭回来. 看了下回复
    还有点问题没有清楚,
    1.如果SetWindowsHookEx和UnhookWindowsHookEx放在DLL中, 那么放
    在钩子函数中肯定不合适..放在什么地方最为合适呢? 2.HOOK( nCode, wparam, lparam )这个是自己写的钩子函数要怎么查MSDN?
    如果我想在这里截获用户按下F1键的消息,我要怎么通过这3个参数来判断?
    (能给点实例代码就最好不过了^^)
      

  7.   

    1.如果SetWindowsHookEx和UnhookWindowsHookEx放在DLL中, 那么放 
    在钩子函数中肯定不合适..放在什么地方最为合适呢? 
    ===========================
    一般的做法是除了钩子处理函数外还在加两个导出函数,一个用于安装钩子,一个用于除去钩子,这两个API刚好放在这两个函数中。另外SetWindowsHookEx虽然可以放在应用程序中,但是放在DLL中要方便一点,因为这个API第三个参数是钩子处理函数所在模块句柄,其实也就是DLL的模块句柄,如果放在应用程序中你还要获取,放在DLL中,DllMain的参数就有了。
    2.HOOK( nCode, wparam, lparam )这个是自己写的钩子函数要怎么查MSDN? 
    =================
    钩子的类型只有那么多,你在MSDN上查SetWindowsHookEx,它在介绍第一个参数时,在解释里面有相应的钩子处理函数的原型
      

  8.   

    全局钩子放DLL,只钩自己程序的放自己程序你就好.......
      

  9.   

    全局钩子放DLL,只钩自己程序的放自己程序你就好.......
      

  10.   


    谢谢了, 查了下MSDN, . 还剩下最后一个小问题了
    一般的做法是除了钩子处理函数外还在加两个导出函数,一个用于安装钩子,一个用于除去钩子,这两个API刚好放在这两个函数中。
    不太理解. 可以详细点吗?
    在加两个导出函数. 怎么来写这两个函数才能完成想构造函数和析构函数一样?
      

  11.   

    可以导出两个全局函数,例如一个StartHook、一个StopHook,里面分别调用SetWindowsHookEx和UnhookWindowsHookEx。
    如果要用类封装,可以把SetWindowsHookEx放在构造函数里面,UnhookWindowsHookEx放在析构函数里面,然后导出这个类。
      

  12.   

    e.........
        意思是给CKeyHookApp加一个构造和析构函数?然后在构造和析构里加上SetWindowsHookEx和UnhookWindowsHookEx吗?
      

  13.   

    不是,要另外定义一个类。其实Hook程序通常是不封装成类的。
    另外提一点,最好用Win32 DLL来做Hook,不要用MFC。