【问题标题】:Why does my keyboard hook receive the same key-up and key-down events multiple times?为什么我的键盘挂钩会多次收到相同的上键和下键事件?
【发布时间】:2012-04-09 14:15:57
【问题描述】:

my previous question 中,我报告说扫描条形码时键盘挂钩会报告所有内容两次。

我把它归结为关键事件和关键事件,并得到了很好的建议。

仔细观察后,我发现每个数字实际上被报告了四次!

这是一个粗略的“打印调试”。谁能建议我可能做错了什么?您需要更多信息吗?我可以忽略每一秒的输入,但是……哎呀!我宁愿了解发生了什么。

这是我得到的一位数 2

---------
LongParam = 196609 |  Word = 50 | 2
LongParam and $80000000 = 0
LongParam and $40000000 = 0
---------
LongParam = 196609 |  Word = 50 | 2
LongParam and $80000000 = 0
LongParam and $40000000 = 0
---------
LongParam = -1073545215 |  Word = 50 | 2
LongParam and $80000000 = 2147483648
LongParam and $40000000 = 1073741824
---------
LongParam = -1073545215 |  Word = 50 | 2
LongParam and $80000000 = 2147483648
LongParam and $40000000 = 1073741824

更新:这是我的代码

function KeyboardHookProc(Code: Integer; WordParam: Word; LongParam: LongInt): LongInt; stdcall;
begin
   if Code < 0 then  // http://msdn.microsoft.com/enus/library/windows/desktop/ms644984%28v=vs.85%29.aspx
   begin
      Result := CallNextHookEx(KBHook, Code, WordParam, LongParam);
      Exit;
   end;

MainForm.Memo1.Lines.Add('---------');
MainForm.Memo1.Lines.Add('LongParam = ' + IntToStr(LongParam) +  ' |  Word = ' +         IntToStr(Ord(WordParam)) + ' | ' + Char(WordParam));
MainForm.Memo1.Lines.Add('LongParam and $80000000 = ' + IntToStr(LongParam and $80000000));
MainForm.Memo1.Lines.Add('LongParam and $40000000 = ' + IntToStr(LongParam and $40000000));

   if ((LongParam and $80000000) <> $80000000)  (* not key up *)
   or ((LongParam and $40000000) <> $40000000)  (* key was not previously down *)
   then
   begin
      Result := CallNextHookEx(KBHook, Code, WordParam, LongParam);
      Exit;
   end;

   if MainForm.ScanningChemical = False then
   begin
      Result := CallNextHookEx(KBHook, Code, WordParam, LongParam);
      Exit;
   end;

此时我有一个条形码数字。但是那些备忘录行是在此之前添加的。

【问题讨论】:

  • 尝试包含您用来处理键盘挂钩的代码以帮助您。
  • 添加了 1 个代码。我试图摆脱 key down 并且只处理 key up,但我似乎收到 两个 每个

标签: delphi hook keyboard-events


【解决方案1】:

您的问题与您评估 Code 参数值的方式有关。 关于KeyboardProc callback function 的文档说明:

HC_NOREMOVE wParam 和 lParam 参数包含有关击键消息的信息,而击键消息尚未被 从消息队列中删除。 (一个名为 PeekMessage 的应用程序 函数,指定 PM_NOREMOVE 标志。)

要解决问题,只需替换此代码

   if Code < 0 then  
   begin
      Result := CallNextHookEx(KBHook, Code, WordParam, LongParam);
      Exit;
   end;

有了这个

   if (Code < 0) or (Code = HC_NOREMOVE ) then
   begin
      Result := CallNextHookEx(KBHook, Code, wparam, lparam);
      Exit;
   end;

【讨论】:

  • 说实话,我不明白这一点。击键已被“删除”是什么意思?如果有人已经删除它,它肯定不会到达我的代码吗?
猜你喜欢
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多