delphi - Windows 键盘钩子(Hook)将所有内容报告两次

标签 delphi winapi hook

我正在使用 Delphi 并尝试通过 USB 读取条形码扫描仪,因此它只是另一个人机接口(interface)设备。

我正确地得到了数字,但每个数字都得到了两次。我想这是按键按下和按键按下。

我可以;用一个标志将它拼凑起来并忽略第二次阅读,但宁愿正确地执行它。

我的代码稍微改编自 this link .

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

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

或者以某种方式检查钩子(Hook)函数本身内的标志?

<小时/>

更新:我尝试为其编写代码,但看起来我错了。这是我在钩子(Hook)函数开始时尝试的内容

// 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;
<小时/>

[进一步更新]五年后,这仍然没有帮助,但我发现我原来的 follow-up question (q.v)确实如此。

最佳答案

在您的KeyboardHookProc中,您需要检查LongParam参数的高位。如果高位为零,则表示有按键按下。如果高位为1,则为按键释放。

例如:

KeyUp:boolean;

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

关于delphi - Windows 键盘钩子(Hook)将所有内容报告两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9833544/

相关文章:

delphi - RAD 工作室 2011 (?)

delphi - 如何快速接受 TCP 连接并同步我的 GUI?

delphi - Firemonkey 组件在运行时移动

python win32 COM关闭excel工作簿

c++ - 在对话框窗口上使用图标 C++ Win32 API

c++ - 如何在启动前为特定应用程序设置 Hook

c - 如何使用 SetWindowsHookEx 过滤低级按键事件?

delphi - firemonkey - 如何以小写字母启动移动键盘?

c++ - "BeginPaint"函数如何知道更新区域-windows编程?

c++ - win 7可以设置单步陷阱吗?