2012-10-11 78 views
5

Tengo una ventana WPF con una cuadrícula de datos. Estoy tratando de capturar, desde un escáner de Symbol, una cadena que se envía a través de una cuña virtual. Para la aplicación, parece que los caracteres fueron escritos. Esta cadena comienza con ASCII 1 (SOH).Evento DataGrid PreviewTextInput eliminación de caracteres de control de la entrada

Cuando la ventana tiene el foco PreviewTextInput de la ventana recibe el SOH, junto con todos los demás valores legibles legibles y no humanos humanos. Sin embargo, cuando la cuadrícula de datos tiene foco, los caracteres legibles no humanos se eliminan.

Si tengo un PreviewKeyDown o PreviewKeyUp en la ventana, entonces los caracteres aparecen correctamente sin importar el foco. Entonces, en algún punto del camino, la cuadrícula de datos lo elimina. Desafortunadamente, debido a que KeyDown/KeyUp no muestran los caracteres ASCII, no puedo usar estos eventos sin tener que escribir algún tipo de algoritmo de análisis.

¿Puede alguien decirme lo que puedo hacer para conseguir esos caracteres de control legibles no humanos que se enviarán siempre a la PreviewTextInput? ¿O cómo analizar todos los caracteres en PreviewKeyDown?

Editado:

Cuando la ventana tiene el foco:

Window PreviewKeyDown - LeftCtrl 
Window PreviewKeyDown - A 
Window PreviewTextInput - <SOH> 
Window PreviewKeyDown - Oem6 
Window PreviewTextInput - ] 
Window PreviewKeyDown - LeftShift 
Window PreviewKeyDown - C 
Window PreviewTextInput - C 

Cuando la cuadrícula de datos tiene el foco:

Window PreviewKeyDown - LeftCtrl 
DataGrid PreviewKeyDown - LeftCtrl 
Window PreviewKeyDown - A 
DataGrid PreviewKeyDown - A 
Window PreviewKeyDown - Oem6 
DataGrid PreviewKeyDown - Oem6 
Window PreviewTextInput - ] 
Window PreviewKeyDown - LeftShift 
DataGrid PreviewKeyDown - LeftShift 
Window PreviewKeyDown - C 
DataGrid PreviewKeyDown - C 
Window PreviewTextInput - C 
+0

Cualquier pensamiento sobre mi respuesta? ¿Ayuda? – Alan

Respuesta

1

bien, sé que esto puede no ser exactamente lo que usted están esperando, pero tengo algo de experiencia en escribir software para algunos escáneres de códigos de barras Symbol. En una aplicación, hicimos que los usuarios escanearan sus identificaciones para autenticarse y anular ciertas condiciones. Queríamos que el usuario "escaneara" su placa y no pudiera escribir los números con el teclado. Recuerdo que pasamos mucho tiempo intentando descubrir cómo hacer que la entrada no entrara como si hubiera sido escrita por el teclado. Creo que pudimos escanear algunos códigos de configuración del manual del escáner de código de barras Symbol para configurarlo para que sea un dispositivo USB que pudiéramos abrir y manejar su entrada como lo deseáramos. Este enfoque fue mucho mejor para nosotros.

¿Has considerado probar algo así?

Este post en los foros de MSDN parece relevante (Converting Key To ASCII

lectores de códigos de barras por lo general puede funcionar en dos modos. Uno de ellos es donde actúa como una cuña de teclado, la generación de pulsaciones de teclas como si el usuario ha escrito el código. Otro es cuando un programa de aplicación recibe el código escaneado directamente, generalmente a través de un puerto en serie. El lector se cambia a un modo en el que genera códigos adecuados para este último método. Ctrl + B es un código de control, SOH (inicio de cabecera). se utiliza para sincronizar el programa con el lector, SOH indica el inicio de una exploración, que tendría que utilizar para restablecer un índice de amortiguamiento.

Deberá configurar el lector para el modo de cuña del teclado donde no generará los caracteres de control. Todavía puede hacer que funcione si es necesario escribiendo un controlador de eventos KeyDown, para detectar el SOH y un controlador de eventos con KeyPressed, para detectar los códigos de exploración. Evite tratar de convertir las pulsaciones de tecla que ve en KeyDown a los caracteres, KeyPressed ya lo hace por usted.

creo que esto puede funcionar para convertir a ASCII:

[DllImport("user32.dll")] 
    static extern int ToAsciiEx(uint uVirtKey, uint uScanCode, byte[] lpKeyState, byte[] arr, uint uFlags, IntPtr hkl); 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool GetKeyboardState(byte[] lpKeyState); 


    private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     byte[] keyboardState = new byte[256]; 
     int keyCode = KeyInterop.VirtualKeyFromKey(e.Key); 
     byte[] arr = new byte[4]; 
     GetKeyboardState(keyboardState); 
     Debug.WriteLineIf(ToAsciiEx((uint)keyCode, 0, keyboardState, arr, 0, IntPtr.Zero) > 0, ASCIIEncoding.ASCII.GetString(arr)); 
    } 
Cuestiones relacionadas