【问题标题】:Windows keyboardhook reporting everything twiceWindows 键盘挂钩报告所有内容两次
【发布时间】:2012-04-07 16:18:02
【问题描述】:

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

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

我可以;用标志将其混杂在一起并忽略第二次读取,但宁愿正确执行。

我的代码稍微改编自this link

我可以在分配挂钩时指定我只需要 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;

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

【问题讨论】:

  • 你搞定了吗?如果没有,您能否提供有关扫描仪的详细信息?
  • +1 抱歉,我出差了。周一会检查。我想这与我还检查以前的键状态有关 - 从条形码扫描仪读取时可能没有必要。
  • 哈哈!!五年后,我也遇到了同样的问题。谷歌并找到一个完全符合我当前问题的问题 - 这是我的问题!谢谢吉姆的回答。

标签: delphi winapi hook


【解决方案1】:

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

例如:

KeyUp:boolean;

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

【讨论】:

  • +1 ,我使用(lparam and $80000000)=$80000000 检测WM_KEYUP
  • +1 是的,我是这么认为的。看起来我编码错误。请参阅上述问题的更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多