2012-03-23 21 views
5

Tôi đang sử dụng Delphi và cố gắng đọc từ máy quét mã vạch qua USB, để nó chỉ là một Thiết bị Giao diện Con người khác.Bàn phím Windows báo cáo mọi thứ hai lần

Tôi nhận được các chữ số chính xác, nhưng nhận được hai lần. Tôi tưởng tượng rằng đây là chìa khóa và chìa khóa.

Tôi có thể; kludge nó với một lá cờ và bỏ qua rất thứ hai đọc, nhưng thay vì làm điều đó propery.

Mã của tôi được điều chỉnh một chút từ this link.

Tôi có thể chỉ định rằng tôi chỉ muốn các sự kiện key_up khi gán móc?

KBHook := SetWindowsHookEx(WH_KEYBOARD, 
          @KeyboardHookProc, 
          HInstance, 
          GetCurrentThreadId()) ; 

hoặc bằng cách nào đó kiểm tra cờ trong chính chức năng móc?


Cập nhật: Tôi đã cố gắng viết mã cho nó, nhưng có vẻ như tôi đã hiểu sai. Đây là những gì tôi đã cố gắng vào lúc bắt đầu chức năng móc tôi

// 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; 

[cập nhật thêm] Năm năm sau đó, và điều này vẫn không giúp đỡ, nhưng tôi thấy rằng tôi gốc follow-up question (q.v) does.

+1

Cậu làm việc này? Nếu không, bạn có thể cung cấp chi tiết về máy quét không? –

+0

+1 xin lỗi, tôi đã đi công tác. Sẽ kiểm tra vào thứ hai. Tôi đoán nó đã làm với tôi cũng kiểm tra trạng thái quan trọng trước đó - mà có lẽ không cần thiết khi đọc từ một máy quét mã vạch. – Mawg

+0

Lolx !! Năm năm sau, tôi có cùng một vấn đề. Google & tìm một câu hỏi hoàn toàn phù hợp với vấn đề hiện tại của tôi - và đó là câu hỏi của tôi! Cảm ơn, Jim cho câu trả lời. – Mawg

Trả lời

16

Trong bàn phímHookProc, bạn cần kiểm tra bit cao của đối số LongParam. Nếu bit cao bằng không, nó là một phím bấm. Nếu bit cao là một, nó là một phát hành quan trọng.

Ví dụ:

KeyUp:boolean; 

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

+1, tôi sử dụng '(lparam và $ 80000000) = $ 80000000' để phát hiện' WM_KEYUP' – RRUZ

+0

+1 Yup, tôi nghĩ vậy. Có vẻ như tôi đã mã hóa nó sai. Vui lòng xem cập nhật cho câu hỏi ở trên – Mawg

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