2012-03-23 10 views
5

Sto usando Delphi e sto provando a leggere da uno scanner di codici a barre tramite USB, in modo che sia solo un altro dispositivo di interfaccia umana.Pulsante tastiera di Windows che riporta tutto due volte

Ottengo correttamente le cifre, ma ottengo due volte ciascuna. Immagino che questa sia la chiave giù e la chiave.

Potrei; escludilo con una bandiera e ignori la seconda lettura, ma preferirei farlo bene.

Il mio codice è leggermente adattato da this link.

Posso specificare che voglio solo eventi key_up quando si assegna l'hook?

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

o in qualche modo controllare un flag all'interno della funzione di hook stessa?


Aggiornamento: Ho provato a programmare per questo, ma sembra che ho sbagliato. Ecco quello che ho provato all'inizio della mia funzione di hook

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

[ulteriore aggiornamento] Cinque anni dopo, e questo ancora non aiuta, ma trovo che il mio originale follow-up question (q.v) fa.

+1

hai preso questo lavoro? In caso contrario, puoi fornire dettagli sullo scanner? –

+0

+1 scusa, ero fuori per lavoro. Verificherà lunedì. Immagino che abbia a che fare con me anche controllando lo stato della chiave precedente - che probabilmente non è necessario quando si legge da uno scanner di codici a barre. – Mawg

+0

Lolx !! Cinque anni dopo, ho lo stesso problema. Google e trova una domanda che corrisponde perfettamente al mio problema attuale ed è la mia domanda! Grazie, Jim per la risposta. – Mawg

risposta

16

Nel KeyboardHookProc, è necessario controllare il bit più elevato dell'argomento LongParam. Se il bit più alto è zero, è una pressione di un tasto. Se il bit più alto è uno, è un rilascio chiave.

Ad esempio:

KeyUp:boolean; 

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

+1, io uso '(lparam e $ 80000000) = $ 80000000' per rilevare' WM_KEYUP' – RRUZ

+0

+1 Yup, pensavo. Sembra che l'abbia codificato in modo errato. Si prega di consultare l'aggiornamento alla domanda di cui sopra – Mawg