2011-04-11 29 views
11

En una computadora tengo tanto un teclado normal como un escáner de código de barras que emula un teclado. Cuando mi aplicación recibe entrada de teclado, ¿cómo puedo determinar si esa entrada proviene del escáner de código de barras o del teclado real?¿Cómo puedo saber si la entrada del teclado proviene de un escáner de código de barras?

+1

1. Abra el Bloc de notas. 2. Escriba en los teclados para ver cuál produce entrada. –

+0

gracias, pero quiero comprobarlo con el código C# !! –

+0

@raha ¿Por qué quieres hacer eso? –

Respuesta

6

Obtendrás la opinión de ambos. No simultáneamente, por supuesto. Todo se colocará en una cola, pero Windows procesará los eventos clave de ambos teclados.

No se desanime, sin embargo. Como sugiere David Heffernan, puede resolver esto fácilmente al conectar ambos teclados a su computadora, abrir el Bloc de notas y escribir caracteres aleatorios para ver cuál genera la entrada.

Responde que quiere "verificar eso con el código C#", pero no tengo idea de lo que eso significa. ¿Qué tal crear una aplicación de consola que lea la entrada desde el teclado y la muestre en la pantalla?

using System; 

class AdvancedKeyboardTester 
{ 
    static void Main(string[] args) 
    { 
     for (; ;) 
     { 
     Console.ReadKey(); 
     } 
    } 
} 

Prensa Ctrl +C cuando se cansan de la diversión y desea salir del programa.


Editar: Parece que usted está buscando la RegisterRawInputDevices function, lo que le permite activar la entrada bruta para todas sus teclados y, a continuación, enumerar a través de los resultados para determinar qué dispositivo ha enviado el mensaje.

Afortunadamente, parece que alguien ya ha escrito una biblioteca de C# envoltorio para esto, está disponible para su descarga en Proyecto Código: Using Raw Input from C# to handle multiple keyboards


Edición 2: (parece que la información sólo sigue engañando desde los comentarios)

Si está utilizando un escáner de código de barras, esto se vuelve mucho más fácil. Debido a que están explícitamente diseñados para este propósito, son casi todos programables. Lo que significa que puedes decirles que prefijan (y/o sufijan) su entrada con algunos caracteres centinela que indican que la entrada proviene del escáner de código de barras, en lugar de un teclado estándar. (Consulte el manual del usuario del escáner de códigos de barras para obtener más información.) Luego, todo lo que tiene que hacer es filtrar la entrada del teclado en función de la presencia o ausencia de esos caracteres centinela. También puede verificar qué tan rápido se ingresaron los caracteres entre el prefijo y el sufijo.

+0

ok.usted realmente me ayuda. Pero no puedo aclarar esto: todo lo que tiene que hacer es filtrar la entrada del teclado en función de la presencia o ausencia de esos caracteres centinela. –

+0

@raha: Correcto, básicamente puedes configurar el escáner para enviar algunos caracteres que básicamente le dicen a la computadora "hola, soy yo". Cuando ve esos caracteres en su flujo de entrada, sabe que la información proviene del escáner de código de barras, no de algo que el usuario escribió en el teclado. ¿Revisó el manual que vino con su escáner de código de barras? Debería tener más información sobre esto. –

+0

gracias querido Cody Gray.¡Yo lo tengo, finalmente! Lo voy a comprobar. (¡Todavía no lo tengo!). –

1

Esto depende del sistema operativo, sin embargo, encontrará que en la mayoría de los sistemas operativos modernos obtendrá entradas simultáneas de ambos. El mejor método sería probarlo en su plataforma.

Evite tener tanto la gente escriba al mismo tiempo;)

+0

uso windows xp. –

4

Tome un vistazo a MultiPoint SDK de Microsoft

(edit: esta respuesta ya no es aplicable ahora que la cuestión se ha aclarado que soy. dejándolo aquí para que otros lo descubran)

+0

ok.thanks.but ¿podría explicar un poco sobre MultiPoint SDK de Microsoft? –

+0

¿Cómo funciona esto con ** teclados **? –

+0

Vea http://en.wikipedia.org/wiki/Windows_MultiPoint_Mouse_SDK: "Se pueden agregar varias estaciones a una computadora host WMS 2010 conectando un único monitor, concentrador USB 2.0, teclado y mouse para cada estación". –

1

Haga que un detector de eventos verifique el tiempo de demora entre las teclas. Un escáner de código de barras enviará pulsaciones de tecla muy rápido, mientras que la entrada de un ser humano usando el teclado será comparativamente lenta. Sé que esto funcionará porque lo he hecho usando Javascript en una aplicación web.

No conozco la programación C#, así que acabo de darte la lógica. ¡Día feliz!

0

Probar:

Dim PreviousKeyPressTime As DateTime = Nothing 

Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown 

    If e.KeyCode = Keys.Enter Then 
     PreviousKeyPressTime = Nothing 
     TextBox1.Text = String.Empty 
    Else 
     If PreviousKeyPressTime = Nothing Then 
      PreviousKeyPressTime = DateTime.Now 
     End If 
     Dim startTime As DateTime = Now 
     Dim runLength As Global.System.TimeSpan = startTime.Subtract(CType(Me.PreviousKeyPressTime, DateTime)) 
     Dim millisecs As Integer = runLength.Milliseconds 
     Dim secs As Integer = runLength.Seconds 
     Dim TotalMiliSecs As Integer = ((secs * 1000) + millisecs) 

     lblDiff.Text = TotalMiliSecs 

     If TotalMiliSecs <= 50 Then 
      lblMsg.Text = String.Empty 
     Else 
      lblMsg.Text = "keyboard Input not Allow" 
     End If 
     PreviousKeyPressTime = DateTime.Now 
    End If 
End Sub 

Fuente: http://itlearnerinsect.blogspot.com/

+1

Sería aún mejor si explicaras el código que publicaste.Además, el enlace del blog está muerto desde el momento de la escritura. –

+0

Este código mide la velocidad de entrada de las teclas y si son demasiado lentas determina que una persona está escribiendo. No puedo decir si realmente funciona, pero esa es la intención del código. – Hucker

0

Casi todos los lectores de códigos de barras se pueden configurar con un prefijo y un sufijo a lo que se lee. Intente configurar el suyo con, por ejemplo, un prefijo de "*" y un sufijo de, y luego en su código C#, fuerce el enfoque a un cuadro de texto invisible cuando * provenga de la secuencia de entrada, y en el evento lostfocus de este cuadro de texto poner todo el código para procesar la entrada. Tenga en cuenta, sin embargo, que el personaje que elige ser el prefijo nunca se ingresa en el teclado. Además, establezca la propiedad Tabstop del cuadro de texto en falso, solo para evitar que el usuario llegue al objeto cuando navega por la pantalla. Buena suerte !

1

Aquí hay algo modelado de la respuesta de @ asif. Es para usar en una aplicación WPF, está en C# y ha sido probado. Fui con Stopwatch porque es más preciso que datetime, lo encontrará en el espacio de nombres System.Diagnostics.

Quería que la mía capturara texto cuando la aplicación (no un cuadro de texto específico) estaba enfocada, por lo que también es un poco diferente. Verá eso para manejarlo correctamente, ya que no sé qué se inserta el personaje real, solo la enumeración Key. Como me importan principalmente los números del 1 al 10 y las enumeraciones son D1, D2, etc., me quito la parte D cuando es necesario.

Stopwatch _inputStopwatch = new Stopwatch(); 
string _input = ""; 

private void Window_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Enter) 
    { 
     _inputStopwatch.Reset(); 
     HandleBarcode(_input); 
     _input = ""; 
    } 
    else 
    { 
     if (!_inputStopwatch.IsRunning) 
      _inputStopwatch.Start(); 
     else if (_inputStopwatch.ElapsedMilliseconds > 50) 
     { 
      _inputStopwatch.Restart(); 
      _input = ""; 
     } 

     Console.WriteLine("DEBUG: " + e.Key + " - " + _inputStopwatch.ElapsedMilliseconds + "ms"); 

     var keyString = e.Key.ToString(); 
     if (keyString.Length == 2 && keyString.StartsWith("D")) 
      keyString = keyString[1].ToString(); 

     //if (_inputStopwatch.ElapsedMilliseconds < 50) 
      _input += keyString; 
     //else 
     // _input = ""; 

     _inputStopwatch.Restart(); 
    } 
} 

private void HandleBarcode(string barcodeInput) 
{ 
    //do stuff with the barcode input 
} 
Cuestiones relacionadas