2012-03-26 138 views
5

my previous question中,我报告说,扫描条形码时,键盘钩子报告了所有内容。为什么我的键盘挂钩多次接收到相同的键盘键和键盘键事件?

我把它放下来,关键事件&,并收到了很好的建议。

仔细看了看,我发现每个数字实际上都是报告四次!

这里是一个粗略的“打印调试”。任何人都可以建议我可能做错了什么?你需要更多信息吗?我可能只是忽略每一秒的输入,但... yeuck!我宁愿明白发生了什么。

这就是我得到了一个数字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

尝试包括代码,您正在使用处理键盘钩来帮助你。 – RRUZ 2012-03-26 02:47:46

+0

已添加1个代码。我试图摆脱关键并只处理关键,但我似乎收到每个 – Mawg 2012-03-26 03:18:24

回答

9

您的问题与您如何评估Code param的值有关。 关于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; 
+0

+1的*两*和答案谢谢*因此*很多。老实说,我真的很感谢 – Mawg 2012-03-26 04:31:44

+0

,我不明白这一点。这是什么意思,击键已被“删除”?如果有人已经删除它,它肯定不会达到我的代码? – Mawg 2012-03-30 06:30:22