你所谓的一次很多情况下并非真的是只有一次。
你按下键盘后必定有一个极端的停滞时间,如果这段时间超过了计算机对键盘的响应时间,那计算机就很有可能读取多次键盘事件。
正确的方法是当计算机读取到第一次键盘事件后,将这个键记录下来,如果接下来瞬间又读取了同一个键盘事件的话程序“不响应”。
更普遍的处理是再设置一个计时器,作用是若在一定时间内都发生了同一键盘事件,那么说明用户一直按住了某个键,于是程序解除“不响应”,从而变为响应所有键盘事件。
WH_KEYBOARD 对于全局的效果不好用, 换用 WH_KEYBOARD_LL 钩子吧。
示例代码:
//全局键盘钩子消息处理函数
function KeyHookProc(nCode:Integer; wP:WPARAM; lP:LPARAM):LRESULT; stdcall;
var
pEvt: TEventMsg;
vKey: Cardinal;
begin
if (nCode = HC_ACTION) then begin
vKey := 0;
case wP of
WM_SYSKEYDOWN, WM_KEYDOWN:
begin
pEvt := PEventMsg(LP)^;
vKey := LOBYTE(pEvtmessage);
case vKey of
end;
end;
end;
WM_SYSKEYUP, WM_KEYUP:;
end;
end;
result := CallNextHookEx(hKeyHook, nCode, wP, lP);
end;
安装钩子:
hKeyHook := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyHookProc, hInstance, 0);
I:设置钩子 设置钩子是通过SetWindowsHookEx ()的API函数 原形: HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId) idhook:装入钩子的类型 lpfn: 钩子进程的入口地址 hMod:
以上就是关于键盘钩子问题全部的内容,包括:键盘钩子问题、delphi 键盘全局钩子、qt中怎么使用键盘钩子等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)