2012-03-26 11 views
5

In my previous question, ho segnalato che un gancio della tastiera stava segnalando tutto due volte durante la scansione di un codice a barre.Perché la mia tastiera riceve gli stessi eventi di key-up e key-down più volte?

L'ho messo giù per digitare gli eventi chiave & e ho ricevuto un buon consiglio.

Dopo averlo esaminato più da vicino, ho scoperto che ogni cifra viene effettivamente segnalata QUATTRO volte!

Ecco un "debug by print". Qualcuno può suggerire cosa potrei fare di sbagliato? Hai bisogno di maggiori informazioni? I potrebbe ignorare ogni secondo input, ma ... sii! Preferirei capire cosa sta succedendo.

Ecco quello che ho ottenuto per una singola cifra 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 

Aggiornamento: ecco il mio codice

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; 

A questo punto ho un cifre del codice a barre. Ma quelle note sono state aggiunte prima qui.

+1

Prova compreso il codice che si stanno usando per elaborare il gancio della tastiera per aiutarti. – RRUZ

+0

1 codice aggiunto. Cerco di sbarazzarmi della chiave e di elaborare solo la chiave, ma mi sembra di ricevere * due * di ogni – Mawg

risposta

9

Il problema è legato al modo in cui si sta valutando il valore del parametro Code. La documentazione sui KeyboardProc callback function stati:

HC_NOREMOVE I parametri wParam e lParam contiene informazioni su un messaggio di battitura, e il messaggio di battitura non è stato rimosso dalla coda di messaggi. (Un'applicazione chiamata la funzione PeekMessage , specificando il flag PM_NOREMOVE.)

Per risolvere il problema basta sostituire questo codice

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

Con questo

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

+1 e la risposta Grazie * così * tanto. Sono veramente grato – Mawg

+0

ad essere onesto, non lo capisco. Cosa significa che il tasto è stato "rimosso"? Sicuramente non raggiungerebbe il mio codice se qualcuno lo avesse già rimosso? – Mawg

Problemi correlati