把GetLastError的返回值记下来,然后用error lookup工具查错误信息。

解决方案 »

  1.   

    error lookup在什么地方?
    还有其他的问题?
      

  2.   

    1.char *_ltoa( long value, char *string, int radix );
      

  3.   

    使用ltoa是不是要include stdlib.h?
      

  4.   

    SetWindowsHookEx的最后一个参数不应该是0(你可以传入GetCurrentThreadID()地返回值),0表示你创建的是全局钩子,那你的钩子函数就应该放在DLL中,并把DLL的hInstance传给SetWindowsHookEx的第3个参数
      

  5.   

    使用ltoa是不是要include stdlib.h对!
      

  6.   

    第3个参数不能为null,应该传你的dll的句柄(在dllmain中可获得)
      

  7.   

    OK,太好了,我真高兴!
    你们真好,可是我不知道怎么把分给你们,明天研究一下!
    还有个问题:
        现在我已经得到了键盘敲打的消息,但是我明明按的是d,却出来1013,d的ascii怎么回这么大?而且还出来两个,这是怎么回事?另外我按了好多字符后,再把弹出的消息框一个个关掉,发现居然又不能截获了,怎么回事?还有,我的程序一关掉后(没有UnHookWindowsHookEx),又不能截获了,不是说全局HOOK将自己映射到其他进程的地址空间了吗?
      

  8.   

    再贴一下:
    #include "stdafx.h"
    #include <stdlib.h>HINSTANCE hHinst;BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    hHinst=(HINSTANCE)hModule;
    }
    return TRUE;
    }HHOOK hHook=NULL;LRESULT CALLBACK KeyboardProc(
      int code,       // hook code
      WPARAM wParam,  // virtual-key code
      LPARAM lParam   // keystroke-message information
    )
    {
    char str[4];
    itoa((int)wParam,str,4);
    MessageBox(NULL,str,"hello",0);
    return 0;//CallNextHookEx(hHook,code,wParam,lParam);
    }extern "C" __declspec(dllexport) BOOL StartHook(void)
    {
    hHook=::SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hHinst,0);
    if(!hHook) return false;
    return true;
    }extern "C" __declspec(dllexport) BOOL EndHook(void)
    {
    if(hHook!=NULL)
    return UnhookWindowsHookEx(hHook);
    else
    return false;
    }
      

  9.   

    itoa()的最后一个参数是进制!你写的4,也就是把10进制转换成4进制,当然很大了。另外,一般在钩子函数中是不调用MessageBox的,这样会很麻烦。
    每次按下和抬起按键都要调用一次钩子函数,所以是两次
    你的程序关闭以后,Windows会自动Unhook德,不然系统不久乱了嘛。映射进别的地址空间不是这个意思(你可以看看Win32内存管理的相关文章)