2012-03-26 1 views
5

my previous questionに、キーボードフックがバーコードをスキャンするときに2回すべてを報告していると報告しました。キーボードのフックが同じキーアップとキーダウンのイベントを何度も受け取るのはなぜですか?

私はそれをキーダウンに入れました。&キーイベントと良いアドバイスを受けました。

もっと詳しく見ると、実際に各桁が4回レポートされています。

ここでは、「印刷によるデバッグ」があります。誰かが私が間違っているかもしれないことを提案することはできますかもっと情報が必要ですか?私はちょうどすべての2番目の入力を無視することができますが...うわー!私はむしろ何が起こっているのか理解しています。

は、ここで私は一桁のために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

てみてくださいでは、このコード

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

を交換する問題を解決するにはあなたを助けるためにキーボードのフックを処理するために使用しています。 – RRUZ

+0

コードが1つ追加されました。私はキーダウンを取り除き、キーアップのみを処理しようとしますが、それぞれ – Mawg

答えて

9

あなたの問題は、Codeパラメータの値をどのように評価するかに関連しています。 KeyboardProc callback function状態に関する ドキュメント:

HC_NOREMOVE のwParamとlParamにパラメータがキーストロークメッセージに関する情報が含まれていて、キーストロークメッセージは、メッセージキューから 削除されていません。 (アプリケーションがPM_NOREMOVEフラグを指定して、のPeekMessage 関数を呼び出した。)

ちょうどあなたのコードを含めて、この

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

+1の2つの*と回答があります。私は本当に感謝しています – Mawg

+0

正直言って、私はこれを理解していません。キーストロークが「削除されました」という意味はどうですか?もし誰かがすでにそれを削除したら、私のコードに到達しないでしょうか? – Mawg

関連する問題