dll钩子中的所有代码如下:
#include <windows.h>static HHOOK hkb = NULL;
HINSTANCE hins;   //钩子函数所在模块的句柄
extern "C"__declspec(dllexport) LRESULT CALLBACK KeyboardProc(int nCode,
       WPARAM wParam,
   LPARAM lParam)
{
if (((DWORD)lParam & 0x40000000) && (HC_ACTION == nCode))
{
switch (wParam)
{
case '1':
MessageBox(NULL, "键1按下", "NOTICE", MB_OK);
break;
case '2':
            MessageBox(NULL, "键2按下", "NOTICE", MB_OK);
break;
case 'J':
MessageBox(NULL, "键J按下", "NOTICE", MB_OK);
}
} //LRESULT 其实就是个long型
LRESULT RetVal = CallNextHookEx(hkb, nCode, wParam, lParam); return RetVal;
}extern "C"__declspec(dllexport) BOOL InstallHook()
{
//获取进程的句柄
         hins = GetModuleHandle(NULL);
MessageBox(NULL, "执行InstallHook", "NOTICE", MB_OK);

if (NULL == hins)
{
MessageBox(NULL, "hins初始化失败", "WARNING", MB_OK);
} hkb = SetWindowsHookEx(WH_KEYBOARD, 
(HOOKPROC)KeyboardProc,
hins,
0); if (NULL == hkb)
{
MessageBox(NULL, "hkb初始化失败", "WARING", MB_OK);
} return TRUE;
}调用dll代码如下
         //函数指针
typedef BOOL (CALLBACK *InstallHook)();
//指针实例
InstallHook installhookFunc; //加载dll
if (hinstDLL = LoadLibrary((LPCTSTR)"D:\\VC++6.0开发\\钩子dll\\Debug\\钩子dll.dll"))
{
installhookFunc = (InstallHook)GetProcAddress(hinstDLL, "InstallHook");
installhookFunc();
}
else
{
MessageBox(NULL, "当前目录找不到钩子.dll文件, 程序初始化失败", "WARNING", MB_OK);
}
        while (true)
        {
          //只是进行测试
        }
问题是:
dll能成功加载,InstallHook也能成功被调用,可是KeyboardProc好像没有装载成功,按键盘上的1、2等键也没有响应,不知道是不是hins这个参数的问题
PS:调用dll的代码包含在一个控台程序里
哪位大侠能指点一下

解决方案 »

  1.   

    可能你加载dll的地方没有消息循环,不等待
    随便建个dialog,建个按钮事件
    void CDddDlg::OnPress() 
    {
    HINSTANCE hinstDLL = LoadLibrary("d:\\keyhook.dll");
    typedef BOOL (WINAPI *installhookFunc)();
    installhookFunc myf;
    myf=(installhookFunc)GetProcAddress(hinstDLL,"InstallHook");
    myf();
    }
    可以KeyboardProc进去的
      

  2.   

    不是啊,我换了个MFC写的dll,钩子就能安装成功,还是一样的调用代码,而这个Win32的dll就不行
      

  3.   

    不是啊,我换了个MFC写的dll,钩子就能安装成功,还是一样的调用代码,而这个Win32的dll就不行我用你的代码,我都行,你不行?而且我用的win32 dll
      

  4.   

    我的怎么就是不行,按照你说的建了一个MFC对话框exe,还是不行,dll的代码你没改吧?