sistema programa para online leer lector configurar con codigos codigo celular barras .net keyboard barcode-scanner

.net - programa - ¿Cómo puedo saber si la entrada del teclado proviene de un escáner de código de barras?



programa para leer codigo de barras (7)

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?


Eche un vistazo al MultiPoint SDK de Microsoft

(Editar: esta respuesta ya no es aplicable ahora que la pregunta ha sido aclarada. Lo dejo aquí para que otros lo descubran)


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 que las dos personas escriban al mismo tiempo;)


Haga que un oyente de eventos verifique el tiempo de demora entre las pulsaciones de 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 sé la programación de C #, así que acabo de darte la lógica. ¡Día feliz!


Tratar:

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/


Casi todos los lectores de códigos de barras se pueden configurar con un prefijo y sufijo para lo que 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 !


Obtendrás información de ambos. No al mismo tiempo , por supuesto. Todo se colocará en una cola, pero Windows procesará los eventos clave de ambos teclados.

Sin embargo, no te desampares. 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.

Usted 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(); } } }

Presione Ctrl + C cuando se canse de la diversión y desee salir del programa.

Editar: Parece que está buscando la función RegisterRawInputDevices , que le permite habilitar la entrada sin formato para todos sus teclados y luego enumerar los resultados para determinar qué dispositivo envió el mensaje.

Afortunadamente, parece que alguien ya ha escrito una biblioteca contenedora C # para esto, disponible para descargar en Code Project: Usar entrada sin procesar desde C # para manejar múltiples teclados

Editar 2: (parece que la información 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.


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 interesan principalmente los números del 1 al 10 y esas 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 }