winapi - español - ¿Es posible tragar una clave en Raw Input?
raw_input python (3)
Puede "tragar" algo de presionar teclas solo escribiendo un controlador de filtro de teclado de kernel. Entonces, si todavía estás en eso, necesitarás un DDK.
Estoy usando la API Raw Input porque necesito poder responder a claves de diferentes dispositivos HID USB de forma diferente, incluso si es la misma clave.
Mi ventana recibe los mensajes WM_INPUT
correctamente. Puedo recuperar la estructura RAWKEYBOARD
para obtener toda la información que necesito.
Ahora quiero evitar que esos dispositivos USB puedan alternar NumLock. Espero que la API de entrada sin procesar me permita tragar la tecla presionar NumLock?
Intenté establecer el resultado del mensaje WM_INPUT en 1, pero parece que no tiene ningún efecto.
(Estoy escribiendo esto en C #, pero como se trata de API de bajo nivel de Windows, probablemente no necesites conocer C # o .NET para responder a esto).
EDITAR: Ah, sí, también he intentado utilizar un gancho de teclado global ( SetWindowsHookEx
) para tragar la tecla pulsada NumLock. Lamentablemente, tan pronto como inicializo la API de entrada sin procesar, ya no se llama al enganche de teclado global mientras la ventana está activa. También intenté configurar el enganche global después de la entrada sin procesar, pero con el mismo efecto.
La API de entrada sin procesar no admite la ingestión de pulsaciones de teclas.
Además, no interactúa con SetWindowsHookEx
dentro del mismo proceso . Tan pronto como se inicializa la API de entrada sin procesar, el gancho se desengancha.
La solución es tenerlos en procesos separados . Un proceso puede usar SetWindowsHookEx
para tragar las claves no deseadas, mientras que otro usa la API de entrada sin formato para procesar las pulsaciones de teclas que se producen. Entonces solo ejecuta los dos. Esto funcionó bien para mí.
Como se escribió anteriormente, no hay posibilidad directa, pero puede hacerlo combinando ganchos de teclado de bajo nivel.
En mi caso, necesito capturar el código del escáner de código de barras, así solo quedan dígitos ENTER.
Mi solución es que RawInput captura todas las claves solo desde el dispositivo de escáner de código de barras. Y la conexión de teclado captura solo los dígitos 0-9 y ENTER y no lo devuelve en absoluto. Luego, dentro del código, estoy decidiendo si la clave debe ser devuelta o no por:
SendKeys.SendWait("{ENTER}");