我写了一个键盘钩子的动态库,但是有时按键没有反映。请高手指点一下,是不是哪儿没有考虑到?
调用程序是用VC写的。
unit HookKey_Unit;interfaceuses Windows, Messages;const
  WM_HOOKKEY = WM_USER + 100;  EVENT_KEYB_NUM0           = 1001; 
  EVENT_KEYB_NUM1     = 1002; 
  EVENT_KEYB_NUM2     = 1003; 
  EVENT_KEYB_NUM3     = 1004; 
  EVENT_KEYB_NUM4     = 1005; 
  EVENT_KEYB_NUM5     = 1006; 
  EVENT_KEYB_NUM6     = 1007; 
  EVENT_KEYB_NUM7     = 1008; 
  EVENT_KEYB_NUM8     = 1009; 
  EVENT_KEYB_NUM9     = 1010; 
  EVENT_KEYB_BOJ     = 1011; 
  EVENT_KEYB_EOJ     = 1012; 
  EVENT_KEYB_VALID          = 1013; 
  EVENT_KEYB_CANCEL     = 1014;
  EVENT_KEYB_GREEN          = 1015; 
  EVENT_KEYB_RED            = 1016; 
  EVENT_KEYB_POINT          = 1017; 
  EVENT_KEYB_EMERGENCY      = 1018; 
  EVENT_KEYB_MONTHCARD      = 1020; 
  EVENT_KEYB_SIMULATE     = 1021; 
  EVENT_KEYB_MILITARY     = 1022; 
  EVENT_KEYB_SERVICE        = 1023; 
  EVENT_KEYB_FREE           = 1024; 
  EVENT_KEYB_CHECK_TICHET   = 1026; 
  EVENT_KEYB_RESERVED1      = 1027; 
  EVENT_KEYB_RESERVED2      = 1028; 
  EVENT_KEYB_LONGCAR        = 1029; 
  EVENT_KEYB_SHOWWEIGHT     = 1030; 
  EVENT_KEYB_RESERVED3      = 1031; 
  EVENT_KEYB_RESERVED4      = 1032; 
  EVENT_KEYB_DOWN           = 1036; 
  EVENT_KEYB_DELETE         = 1041;
  EVENT_KEYB_CHONGKA        = 1043; 
  EVENT_KEYB_THREETYRES     = 1130;  procedure Init(hWnd: HWND); cdecl;
procedure Close; cdecl;implementationvar
  HookHandle: HHook;
  AppHandle: HWND;function MapKey(CharCode: Word): Word;
var
  k: Word;
begin
  k := 0;
  case CharCode of
    96:  k := EVENT_KEYB_NUM0;  //0
    97:  k := EVENT_KEYB_NUM1 ; // 1
    98:  k := EVENT_KEYB_NUM2 ; // 2
    99:  k := EVENT_KEYB_NUM3 ; // 3
    100: k := EVENT_KEYB_NUM4 ; // 4
    101: k := EVENT_KEYB_NUM5 ; // 5
    102: k := EVENT_KEYB_NUM6 ; // 6
    103: k := EVENT_KEYB_NUM7 ; // 7
    104: k := EVENT_KEYB_NUM8 ; // 8
    105: k := EVENT_KEYB_NUM9 ; // 9
    27:  k := EVENT_KEYB_BOJ; // ESC
    8 :  k := EVENT_KEYB_CANCEL; //BackSpace
    13:  k := EVENT_KEYB_VALID; // 回车
    65:  k := EVENT_KEYB_SHOWWEIGHT; // A
    66:  k := EVENT_KEYB_EMERGENCY; // B
    67:  k := EVENT_KEYB_LONGCAR; // C
    68:  k := EVENT_KEYB_MILITARY; // D
    69:  k := EVENT_KEYB_MONTHCARD; // E
    70:  k := EVENT_KEYB_DELETE; // F
    71:  k := EVENT_KEYB_RESERVED2; // G
    72:  k := EVENT_KEYB_THREETYRES; // H
    73:  k := EVENT_KEYB_SERVICE; // I
    74:  k := EVENT_KEYB_FREE; // J
    76:  k := EVENT_KEYB_POINT; // K
    75:  k := EVENT_KEYB_EOJ; // L
    77: ; // M
    78: ; // N
    112: k := EVENT_KEYB_RESERVED1; // F1
    113: k := EVENT_KEYB_SIMULATE; // F2
    114: k := EVENT_KEYB_RESERVED3; // F3
    115: k := EVENT_KEYB_RESERVED4; // F4
    116: k := EVENT_KEYB_GREEN; // F5
    117: k := EVENT_KEYB_RED; // F6
    118: ; // F7
    119: ; // F8
    120: k := EVENT_KEYB_CHONGKA;  // F9
    121: ;        // F10
  end;  Result := k;
end;function KeyHook(Code: Integer;
                wParam: WPARAM;
                lParam: LPARAM
                 ): LRESULT; stdcall;
var
  k: TWMKey;
  m: TMessage;
  c: Word;
begin
  if Code = HC_ACTION then
   begin
     if ((lParam shr 31) and 1) = 1 then   //是否KeyUp
     begin
       m.Msg := 0;
       m.WParam := wParam;
       m.LParam := lParam;
       m.Result := 0;       k := TWMKey(m);
       c := MapKey(k.CharCode);
       if c > 0 then
       begin
         PostMessage(AppHandle, WM_HOOKKEY, c, 0);
         result := 1;
       end
       else
       begin
         Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
       end;
     end
     else
       Result := 1;
  end
  else
    Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;procedure Init(hWnd: HWND); cdecl;
begin
  AppHandle := hWnd;
  HookHandle := SetWindowsHookEx(WH_KEYBOARD, KeyHook, HInstance, 0);
end;procedure Close; cdecl;
begin
  UnhookWindowsHookEx(HookHandle);
end;
end.