小弟刚学windows hook,想用全局键盘钩子做一个改键程序,不知道哪里出了问题,帖出代码请教一下大家。dllmain代码extern HHOOK     CuhHook;
extern HINSTANCE g_hModule;
extern BOOL StopHook();BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
 )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hModule = (HINSTANCE)hModule;
break; case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
StopHook();
break;
}
return TRUE;
}
头文件#pragma once#ifdef KEYHOOKLIB_EXPORTS  
#define KEYHOOKLIB_API __declspec(dllimport)  
#else  
#define KEYHOOKLIB_API __declspec(dllexport)  
#endif  HHOOK     CuhHook = NULL;
HINSTANCE g_hModule;EXTERN_C KEYHOOKLIB_API BOOL StartHook();
BOOL StopHook();
cpp文件LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(CuhHook, nCode, wParam, lParam);
}EXTERN_C KEYHOOKLIB_API BOOL StartHook()
{
CuhHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hModule, 0); if (CuhHook != NULL)
return 1;
else
return 0;
}BOOL StopHook()
{
if (UnhookWindowsHookEx(CuhHook))
return 1;
else
return 0;
}
生成dll之后,再创建一个win32 console程序,加载dll并调用StartHook函数,调用后发现钩子安装成功了。但是一旦按下任何毽子,windows直接卡死了,请问大家问题出在哪儿呢?

解决方案 »

  1.   

    是不是有多次安装的可能性EXTERN_C KEYHOOKLIB_API BOOL StartHook()
    {
      if(CuhHook == NULL)
        CuhHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hModule, 0);    if (CuhHook != NULL)
            return 1;
        else
        {
          DWORD dwErr = GetLastError();
          ASSERT(0);
          return 0;
        }
    }BOOL StopHook()
    {
      if(CuhHook)
      { 
        if (UnhookWindowsHookEx(CuhHook))
        {
          CuhHook = NULL;
          return 1;
        }
        else
        {
          DWORD dwErr = GetLastError();
          ASSERT(0);
        }
      }
      return 0;
    }
      

  2.   

    你这个case DLL_THREAD_ATTACH:后面要bread一下吧,不然也要调StopHook吗
      

  3.   

    在StartHook()函数中设置个断点,F5运行停下来的时候看堆栈 就知道是哪里调用了,如果是正常的调用继续F5 不正常的修改之
      

  4.   

    >>生成dll之后,再创建一个win32 console程序,加载dll并调用StartHook函数...
    控制台程序没有消息循环,无法使用全局钩子, 下面是我以前曾遇到过的和你相同的问题:
    http://topic.csdn.net/u/20081023/22/1a0984ca-3bba-4f72-b9b4-67a769899555.html
      

  5.   

    所有代码都在这儿了:// dllmain.cpp : 定义 DLL 应用程序的入口点。
    #include "stdafx.h"
    #include <windows.h>
    #include <stdio.h>
    #include "KeyHook.h"#pragma data_seg ("shared")
    static HHOOK     g_hHook = NULL;
    #pragma data_seg ()HINSTANCE g_hModule = NULL;LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    return CallNextHookEx(g_hHook, nCode, wParam, lParam);
    }EXTERN_C KEYHOOKLIB_API BOOL StartHook()
    {
    if (g_hHook == NULL)
    g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, g_hModule, 0); if (g_hHook != NULL)
    return 1;
    else
    return 0;
    }EXTERN_C KEYHOOKLIB_API BOOL StopHook()
    {
    if (UnhookWindowsHookEx(g_hHook))
    return 1;
    else
    return 0;
    }BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
     )
    {
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    g_hModule = (HINSTANCE)hModule;
    break; case DLL_THREAD_ATTACH:
    break; case DLL_THREAD_DETACH:
    break; case DLL_PROCESS_DETACH:
    break;
    }
    return TRUE;
    }
      

  6.   

    LowLevelKeyboardProc 低级键盘钩子 和低级鼠标钩子 都可以直接写在程序了的,不需要写在dll里面。
      

  7.   

    http://download.csdn.net/source/1781587
    还是下载我的源码吧
    我的群110337996
      

  8.   

    StopHook()没有判断有效性 句柄没有清零
    也就是安装一次 卸载了 再也安装不起来了
    给你的代码你怎么都不改呢 造成多次安装卸载的与你的调用程序有关,从这里看不出问题
      

  9.   

    [email protected]
    虽然我也是新手,但帮你调个钩子,应该还凑合
      

  10.   

    昨天没有看邮箱,不好意思,已经调好了。
    不过我使用的工具是VS2008,楼主应该使用的是VC6.0,可能无法打开。
    反正,你试着把WH_KEYBOARD_LL修改为WH_KEYBOARD应该能解决问题。