我写了一个键盘钩子的动态库,但是有时按键没有反映。请高手指点一下,是不是哪儿没有考虑到?
调用程序是用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.
调用程序是用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.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货