2012-03-26 35 views
5

Trong my previous question, tôi đã báo cáo rằng móc nối bàn phím đã báo cáo mọi thứ hai lần khi quét mã vạch.Tại sao móc khóa bàn phím của tôi nhận được các sự kiện liên tục và nhấn phím nhiều lần?

Tôi đặt xuống để khóa các sự kiện chính & và nhận được lời khuyên tốt.

Sau khi xem xét kỹ hơn, tôi thấy rằng mỗi chữ số thực sự đang được báo cáo BỐN lần!

Đây là bản "gỡ lỗi bằng bản in" thô. Bất cứ ai có thể đề nghị những gì tôi có thể làm sai? Bạn cần thêm thông tin không? Tôi có thể chỉ bỏ qua mọi đầu vào thứ hai, nhưng ... yeuck! Tôi thà hiểu những gì đang xảy ra.

Đây là những gì tôi đã cho một chữ số duy nhất 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 

Cập nhật: đây là mã của tôi

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; 

Tại thời điểm này tôi có một chữ số mã vạch. Nhưng những dòng ghi nhớ đó đã được thêm vào trước đây.

+1

Hãy thử bao gồm cả mã mà bạn đang sử dụng để xử lý móc nối bàn phím để giúp bạn. – RRUZ

+0

Đã thêm 1 mã. Tôi cố gắng để loại bỏ chìa khóa xuống và chỉ xử lý khóa, nhưng tôi dường như nhận được * hai * của mỗi – Mawg

Trả lời

9

Sự cố của bạn liên quan đến cách bạn đánh giá giá trị của thông số Code. Các tài liệu về KeyboardProc callback function trạng thái:

HC_NOREMOVE Các thông số wParam và lParam chứa thông tin về một thông điệp tổ hợp phím, và thông điệp tổ hợp phím đã không loại bỏ khỏi hàng đợi thông điệp. (Đơn được gọi là chức năng PeekMessage , xác định cờ PM_NOREMOVE.)

Để khắc phục vấn đề này chỉ cần thay thế mã này

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

Với điều này

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

+1 và câu trả lời Cảm ơn bạn * vì vậy * nhiều. Tôi thực sự biết ơn – Mawg

+0

thành thật mà nói, tôi không hiểu điều này. Điều gì có nghĩa là tổ hợp phím đã được "loại bỏ"? Chắc chắn nó sẽ không đạt được mã của tôi nếu ai đó đã gỡ bỏ nó? – Mawg

Các vấn đề liên quan