WH_KEYBOARD_LL  is Global only!    ghKeyHook = ::SetWindowsHookEx( WH_KEYBOARD_LL, KeyboardProc, 
        ::AfxGetApp()->m_hInstance, 0 );

解决方案 »

  1.   

    试试::SetWindowsHookEx( WH_KEYBOARD, KeyboardProc, 
            AfxGetInstanceHandle(), 0 );
    to zhq2000:  没有搞错吧,WH_KEYBOARD_LL是只能在NT下用的
      

  2.   

    顺便将我写的一个键盘钩子贴出来吧:
    //头文件
    #ifndef _LHOOK_H_
    #define _LHOOK_H_
    ///////////////////////////////////////////////////////////////////////////////
    #ifndef HOOKLIBAPI
    #define HOOKLIBAPI  __declspec(dllimport)
    #endif
    //-----------------------------------------------------------------
    LRESULT HOOKLIBAPI KbdHookProc (int nCode, WPARAM  wParam, LPARAM lParam) ;
    BOOL HOOKLIBAPI InstallKeyboardHook (HWND hWnd);
    BOOL HOOKLIBAPI DeInstallKeyboardHook();
    ///////////////////////////////// End of File /////////////////////////////////#endif // LHOOKDLL_H
    //实现文件
    #include <windows.h>
    #define HOOKLIBAPI  __declspec(dllexport)
    #include "lHook.h"#pragma data_seg("Shared")
    //----------------------------------键盘HOOK
    HHOOK     ghKeyHook = NULL ;
    HOOKPROC  glpfnHookProc = 0;#pragma data_seg()
    // 用Shared的方式来编译,并加上rws属性,表示以上变量可以读、写和共享
    #pragma comment(linker, "/section:Shared,rws")///////////////////////////////////////////////////////////////////////////////HINSTANCE g_hinstDll = NULL;      // instance handle//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved) 
    {
       switch (fdwReason) 
       {
          case DLL_PROCESS_ATTACH:
             g_hinstDll = hinstDll;
             break;
       }
       return(TRUE);
    }BOOL  InstallKeyboardHook (HWND hWnd)
    {
    BOOL bSuccess = FALSE;
    if (!ghKeyHook)
    {   
    glpfnHookProc = (HOOKPROC) KbdHookProc;
    bSuccess = (NULL != (ghKeyHook = ::SetWindowsHookEx(WH_KEYBOARD, glpfnHookProc, g_hinstDll, NULL)));
    }
    return bSuccess;
    }BOOL  DeInstallKeyboardHook()
    {
    if (ghKeyHook)
    {
    if (TRUE == (0 != ::UnhookWindowsHookEx(ghKeyHook)))
    {
    ghKeyHook = NULL;
    }
    } return (NULL == ghKeyHook);
    }
    LRESULT  KbdHookProc (int nCode, WPARAM  wParam, LPARAM lParam)    
    {
        //your code here
        return ::CallNextHookEx (ghKeyHook, nCode, wParam, lParam);
    }
      

  3.   

    随风的回答正确!
    关键是把SetWindowsHookEx放到动态连接库中去。Windows NT和2000必须采用WH_KEYBOARD_LL才能在系统处理前钩到键盘输入。
      

  4.   

    一定要把SetWindowsHookEx的第三个参数设置成该动态连接库的HANDLE且第四个参数为NULL。