2012-03-23 5 views
5

Estoy usando Delphi y tratando de leer desde un escáner de código de barras a través de USB, por lo que es simplemente otro dispositivo de interfaz humana.Anclaje de teclado de Windows informando todo dos veces

obtengo los dígitos correctamente, pero obtengo cada uno dos veces. Me imagino que esto es clave y clave.

Podría; kludge con una bandera e ignora la segunda lectura, pero prefiere hacerlo de forma adecuada.

Mi código se ha modificado ligeramente de this link.

¿Puedo especificar que solo deseo eventos key_up al asignar el gancho?

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

o de alguna manera comprobar una bandera dentro de la función de enlace?


Actualización: Intenté codificarlo, pero parece que lo hice mal. Esto es lo que he intentado en el inicio de mi función de enlace

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

[Además de actualización] Cinco años después, y esto todavía no ayuda, pero me parece que mi original follow-up question (q.v) hace.

+1

consiguió este trabajo? Si no, ¿puede dar detalles sobre el escáner? –

+0

+1 lo siento, estaba fuera por negocios. Verificará el lunes. Supongo que tiene que ver conmigo también verificando el estado de la tecla anterior, que probablemente no sea necesario al leer un escáner de código de barras. – Mawg

+0

Lolx !! Cinco años después, tengo el mismo problema. Google y encuentre una pregunta que coincida perfectamente con mi problema actual, ¡y es mi pregunta! Gracias, Jim por la respuesta. – Mawg

Respuesta

16

En su KeyboardHookProc, debe comprobar el bit alto del argumento LongParam. Si el bit alto es cero, es presionar una tecla. Si el bit alto es uno, es un lanzamiento clave.

Por ejemplo:

KeyUp:boolean; 

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

+1, uso '(lparam y $ 80000000) = $ 80000000' para detectar' WM_KEYUP' – RRUZ

+0

+1 Sí, eso creía. Parece que lo he codificado incorrectamente. Por favor, consulte la actualización a la pregunta anterior – Mawg