Windows键盘挂钩报告所有内容两次



我正在使用Delphi,并试图通过USB从条形码扫描仪中读取,因此它只是另一个人机界面设备。

我把数字记对了,但每个数字都记两次。我想这是关键向下和关键向上。

我可以;用flag把它拼凑起来,忽略第二次阅读,但宁愿做得很好。

我的代码是根据这个链接稍微改编的。

我可以指定在分配钩子时只需要key_up事件吗?

KBHook := SetWindowsHookEx(WH_KEYBOARD,
                           @KeyboardHookProc,
                           HInstance,
                           GetCurrentThreadId()) ;

或者以某种方式检查钩子函数本身中的标志?


更新:我试着为它编码,但看起来我弄错了。以下是我在挂钩功能开始时尝试的内容

// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644984%28v=vs.85%29.aspx
if Code < 0 then  
begin
   Result := CallNextHookEx(KBHook, Code, WordParam, LongParam);
   Exit;
end;
if (((LongParam and $80000000) <> $80000000)    (* key is not being released *)
and ((LongParam and $40000000) <>  $40000000))  (* key was not previously down *) then
begin
   Result := CallNextHookEx(KBHook, Code, WordParam, LongParam);
   Exit;
end;

[进一步更新]五年后,这仍然没有帮助,但我发现我最初的后续问题(q.v)确实有帮助。

在KeyboardHookProc中,您需要检查LongParam参数的高位。如果高位为零,则为按键。如果高位是一个,那么它就是一个密钥释放。

例如:

KeyUp:boolean;
KeyUp := ((LongParam and (1 shl 31)) <> 0);

最新更新