2012-03-23 17 views
5

Używam Delphi i próbuję czytać ze skanera kodów kreskowych przez USB, tak, że jest to po prostu kolejny Human Interface Device.Windowsowy hak klawiatury zgłasza wszystko dwa razy

Dostaję poprawnie cyfry, ale otrzymam je dwa razy. Wyobrażam sobie, że to jest klucz i klucz.

Mogłem; kludge to z flagą i zignorować bardzo drugi raz, ale wolałby zrobić to propery.

Mój kod został nieznacznie zmieniony z this link.

Czy mogę określić, że chcę tylko zdarzenia key_up podczas przypisywania haka?

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

lub w jakiś sposób sprawdzić flagę w ramach samej funkcji haka?


Aktualizacja: próbowałem kodować, ale wygląda na to, że źle się spisałem. Oto, co starałem się na początku mojej funkcji haka

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

[Update] Dalsze Pięć lat później, i to nie pomoże, ale uważam, że mój oryginalny follow-up question (q.v) robi.

+1

Dostałeś tę pracę? Jeśli nie, czy możesz podać szczegóły dotyczące skanera? –

+0

+1 Przepraszam, byłem w interesach. Sprawdzę w poniedziałek. Myślę, że ma to związek ze sprawą również sprawdzenia poprzedniego stanu klucza - co prawdopodobnie nie jest konieczne podczas odczytu ze skanera kodów kreskowych. – Mawg

+0

Lolx !! Pięć lat później mam ten sam problem. Google i znajdź pytanie, które idealnie pasuje do mojego obecnego problemu - i to jest moje pytanie! Dzięki, Jim za odpowiedź. – Mawg

Odpowiedz

16

W swoim KeyboardHookProc, należy sprawdzić wysoki bit argumentu LongParam. Jeżeli bit wysoki wynosi zero, jest to naciśnięcie klawisza. Jeśli wyższy bit to jeden, jest to kluczowe wydanie.

Na przykład:

KeyUp:boolean; 

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

+1, używam '(lparam i 80000000 $) = 80000000 $' do wykrywania' WM_KEYUP' – RRUZ

+0

+1 Tak, tak myślałem. Wygląda na to, że zakodowałem to błędnie. Zobacz aktualizację do powyższego pytania – Mawg

Powiązane problemy