Alto nivel de enlace de teclado global para C # y WPF para leer un escáner de tarjetas de emulación de teclado

StackOverflow https://stackoverflow.com/questions/2137099

Pregunta

El único gancho de teclado soportado para .NET código administrado es un enlace de teclado de bajo nivel (WH_KEYBOARD_LL).

Usando gancho de teclado globales (WH_KEYBOARD_LL) en WPF / C #

Tengo el código anterior trabajando en mi solicitud en el momento para que cuando pase su tarjeta obtendrá una lista de todas las pulsaciones de teclado. El problema es para la tipificación delimitador de caracteres tales como "%" y ";" me enviará Alt + Teclado numérico +? objetos WPF tecla correspondiente a estos símbolos.

Mi pregunta: ¿Hay alguna manera de hacer esto se comportan más alto nivel, es decir, para capturar una cadena generada a partir de todos los comandos de teclado

Saludos!

¿Fue útil?

Solución

No está seguro de lo que está pasando, pero conseguir un personaje como% de un gancho de teclado es muy no trivial. El gancho sólo se le notifica de teclas virtuales. Pero% es una clave de mecanografía, producido presionando Shift + 5 en mi teclado (a disposición de los EEUU). Windows normalmente produce estos caracteres mediante el procesamiento de los mensajes WM_KEYDOWN / UP, generando un mensaje WM_CHAR para la clave de escritura. Eso no está sucediendo en su caso. La función de bajo nivel de Windows que hace esto es ToUnicodeEx ().

Otros consejos

Yo diría que si usted está deslizar la tarjeta, hay una entrada en alguna parte en el formulario de WPF, como un cuadro de texto, por ejemplo? Entonces me inclinaría a añadir un evento, tal vez un manejador KeyUp Evento, (El escáner de tarjetas de cuña de teclado no envía una señal de fin de procesamiento, como ENTER para indicar el golpe fue sí satisfactorios?), En el KeyUp gestor de eventos, construir una cadena utilizando StringBuilder, y cuando el final de procesamiento de señales, tales como entrar es capturado, a continuación, puede eliminar el "%" y ";" desde la instancia de StringBuilder y hacer lo que tiene que ver con ello.

Puede ser que sea más fácil de usar un sistema de estado, cuando el controlador de eventos KeyUp recibe un "%", entonces entrar en otro estado donde el estado final esperado sería un ";"

static bool StartState = false;
StringBuilder sbInput = new StringBuilder();
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
   if (!StartState){
    if (e.KeyCode == Keys.D5) StartState = true;
    sbInput.Append((char)e.KeyValue);
   }else{
    if (e.KeyCode == Keys.OemSemicolon){
       StartState = false;
       // sbInput will contain the data from the scanner,
       // copy it somewhere else and reset sbInput
       // sbInput.Remove(0, sbInput.Length); 
    }
    sbInput.Append((char)e.KeyValue);
   }
   e.Handled = true;
}

Espero que esta ayuda, Atentamente, Tom.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top