内容如题。

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=271
      

  2.   

    只能用DLL.还没见过EXE的钓子.(没试过.灌下水了)
      

  3.   

    楼主可能有点概念还不明白,钩子分为全局钩子和局部钩子。
    如果你只HOOK本进程得消息,可以把消息回调函数和调用钩子的函数写在一起,也就是只需要写个EXE就可以了。
    如果要HOOK全局消息,需要全局钩子,这样,需要把你的HOOK代码注入到系统每个进程里面去。而实现这个最好的方法,就是用DLL来实现。系统会自动把该DLL注入到所有的进程空间中。所以,不一定是必须要写DLL来HOOK,看你用的范围来决定!!!
      

  4.   

    同意楼上,但要补充一点,全局消息钩子不一定非要做成DLL,像WH_KEYBOARD_LL、WH_MOUSE_LL等几个消息可以用EXE来实现全局HOOK。这个问题,CSDN以前有个帖子介绍过。
      

  5.   

    全局钩子必须写在DLL中,局部钩子可以写在应用程序自身内!局部钩子
    http://www.vckbase.com/code/listcode.asp?mclsid=13&sclsid=1309
    用钩子实现重现用户操作全局钩子
    http://www.vckbase.com/code/listcode.asp?mclsid=13&sclsid=1309
    Windows XP系统中如何屏蔽 Ctrl+Alt+Del、Alt+Tab以及Ctrl+Esc键序列
      

  6.   

    呵呵,帮你搜了好几份资料深入解析钩子和动态链接库
    http://www.csdn.net/develop/Read_Article.asp?id=26865深入浅出HOOKS
    http://www.csdn.net/develop/Read_Article.asp?id=17914给DLL初学者——全程键盘钩子的一种简单实现
    http://www.csdn.net/develop/read_article.asp?id=16499
      

  7.   

    就是上面各位兄弟说的那样了:局部的钩子当然可以写在自己的exe中,但是全局钩子还是要用dll来实现地~~~^_^
      

  8.   

    写成dll是因为windows要把你的dll映射到各个进程独立的地址空间里面去——如果你写的是全局钩子的话。
    如果是单对本进程而言,可以不用dll。
      

  9.   

    但是有的键盘记录软件如KeyLogger,只有一个exe文件,但他可以实现全局键盘记录,是怎样实现的呢?
      

  10.   

    可以只使用EXE,不过必须使用汇编,因为高级语言据我所知无法解决代码重定位的问题。
      

  11.   

    To Toogo(Toogo),你说的那个KeyLogger可以用exe做,因为它HOOK了WH_KEYBOARD_LL消息,关于这个消息的全局钩子是可以在EXE中实现的,写一个试试就知道了。To 楼上各位,你们也可以写一个WH_KEYBOARD_LL全局钩子EXE程序试试,是正确的。
      

  12.   

    好象WH_KEYBOARD_LL在vc6中不支持,应该怎么做啊?
      

  13.   

    #define WH_KEYBOARD_LL 13typedef struct tagKBDLLHOOKSTRUCT {
        DWORD     vkCode;
        DWORD     scanCode;
        DWORD     flags;
        DWORD     time;
        ULONG* dwExtraInfo;
    } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;把上面那一段声明加到你的程序里就可以了。
      

  14.   

    回调函数应该怎么写呢?
    比如说我按每一个键都弹出一个MessageBox
    应该怎么做呢?
      

  15.   

    /************************************************************************
    Module:  DisableLowLevelKeys.cpp
    Notices: Written 2000 Jeffrey Richter
    **************************************************************************/#define _WIN32_WINNT 0x0400
    #include <Windows.h>/////////////////////////////////////////////////////////////////////////
    LRESULT CALLBACK LowLevelKeyboardProc(int nCode, 
       WPARAM wParam, LPARAM lParam) {   BOOL fEatKeystroke = FALSE;   if (nCode == HC_ACTION) {
          switch (wParam) {
          case WM_KEYDOWN:  case WM_SYSKEYDOWN:
          case WM_KEYUP:    case WM_SYSKEYUP: 
             PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
             fEatKeystroke = 
                ((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
                ((p->vkCode == VK_ESCAPE) && 
                ((p->flags & LLKHF_ALTDOWN) != 0)) ||
                ((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 
                 0x8000) != 0));
             break;
          }
       }
       return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, 
              lParam));
    }/////////////////////////////////////////////////////////////////////////
    int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {   // Install the low-level keyboard & mouse hooks
       HHOOK hhkLowLevelKybd  = SetWindowsHookEx(WH_KEYBOARD_LL, 
          LowLevelKeyboardProc, hinstExe, 0);   // Keep this app running until we're told to stop
       MessageBox(NULL, 
          TEXT("Alt+Esc, Ctrl+Esc, and Alt+Tab are now disabled.\n")
          TEXT("Click \"Ok\" to terminate this application and re-enable
                these keys."),
          TEXT("Disable Low-Level Keys"), MB_OK);
       UnhookWindowsHookEx(hhkLowLevelKybd);   return(0);
    }///////////////////////////// End Of File ///////////////////////////////这是msdn里的一个例程,希望对你有所帮助。
      

  16.   

    我不同意 楼上说的全局钩子非得写入DLL
    hhook=SetWindowsHookEx (WH_JOURNALRECORD,(HOOKPROC)HookProc, hInst, 0); 
    WH_JOURNALRECORD属于全局键盘钩子 我用它却不用写入DLL
      

  17.   

    这要从头说起,在98下,内存划分为高2G和低2G,这两部分的作用就不用我罗嗦了吧,基本上和2k是差不多的。但是,有一个区别,对于dll,9x可能出于效率的考虑,把它装在高2G,这样可以在多个进程之间共享代码,所以像那3个著名的dll,都是在高2G里,所有进程使用同一份拷贝。这就使得全局api hook比较方便,只要把dll加载到高2G,用一个简单的jmp在api入口的地方跳到我们的hook dll里面,处理完了再跳回去即可。之所以做成dll,是因为dll可以方便地加载于高2G的地址空间,现在你明白了?只要能把一个模块加载到高2G的空间去,不一定要做成dll。
    但是同样的情况在2K下不再成立,dll装载于低2G中,即使是user32.dll这样的系统dll,也是每个进程有一个拷贝,所以你即使修改了本进程的dll,也不能影响到其他进程,要完成全局hook,就必须要将我们的hook dll自动加载到系统中每个进程当中去,对于将来运行的进程,也必须要自动加载才行,注册表中有一个表项,可以指定一个dll在每个进程启动的时候都必须自动加载,这样对于完成api hook稍微方便一点:)
      

  18.   

    最后再罗嗦几句,因为exe和dll对装载器而言是不同的模块,对于一个模块,在不同进程中,是处于不同的虚拟地址上,但是必须最后映射到同一段物理地址,这样重定位问题是非常麻烦的——如果你不做成dll的话。
      

  19.   

    呵呵呵,这个简单。的确钩子必须要用DLL,但是如果楼主有需求只用EXE,也行。把DLL当作资源读入EXE中……明白?不明白的话给了分再讨论。