Diferenciar eventos según teclado C#

Iniciado por kondrag_X1, 12 Abril 2015, 19:09 PM

0 Miembros y 1 Visitante están viendo este tema.

kondrag_X1

Hola gente,

Miren pues resulta que estoy haciendo un programa en C# y quisiera saber como diferenciar cuando es un teclado u otro. Es decir, tengo el teclado y despues tengo un disposito conectado por usb que simula un teclado. Mi problema es como diferenciarlos en los eventos del form, en concreto estoy utilizando el evento Keypress.

un saludo.

fran800m

Quizá debas interrogar al sistema operativo sobre los dispositivos conectados.

En una búsqueda rápida he encontrado la clase KeyboardCapabilities y el namespace Windows.Devices.Input prueba por ahí a ver qué encuentras.

Un saludo,

Eleкtro

#2
Cita de: kondrag_X1 en 12 Abril 2015, 19:09 PMen concreto estoy utilizando el evento Keypress.

Puedes hacerlo mediante la detección genérica de la entrada del teclado (RAW Input), pero requiere la implementación de una lógica algo tediosa (o aburrida), primero debes documentarme bastante (sobre todos los conceptos, mensajes, y estructuras que no mencionaré aquí abajo) y realizar mucho P/Invoking en tu código.

1) Obten los dispositivos de teclado/usb con la función GetRawInputDeviceList:
https://msdn.microsoft.com/es-es/library/windows/desktop/ms645598%28v=vs.85%29.aspx

2) Registra los dispositivos obtenidos, con la función RegisterRawInputDevices:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms645600%28v=vs.85%29.aspx

3) Intercepta los mensajes de la ventana (WndProc):
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc%28v=vs.110%29.aspx

4) Espera a que se reciba el mensaje WM_INPUT (0x00FF):
https://msdn.microsoft.com/en-us/library/windows/desktop/ms645590%28v=vs.85%29.aspx

5) Examina el parámetro lParam del mensaje filtrado, el cual contiene una dirección de memoria hacia una estructura RAWKEYBOARD ...debes asignar los datos del bloque de la memoria no administrada hacia una instancia de esa estructura (lo haces con la Class Marshal) para determinar de que teclado proviene la entrada (el input) además de la tecla virtual (vKey) y el tipo de mensaje (WM_KEYDOWN, WM_KEYUP, etc):
https://msdn.microsoft.com/en-us/library/windows/desktop/ms645575%28v=vs.85%29.aspx

6) Evaluas si es el teclado que quieres que sea, y activas un flag booleano en cualquier parte (Dim isPrimaryKeyboard = True), o guardas los datos que quieras para hacer otro tipo de evaluaciones...

7) Cuando se dispare el evento KeyPress en tu event-handler, determinas la cancelación del evento (e.Handled) dependiendo del valor de ese flag, o de dicha evaluación.

8) Vuelta a empezar desde el punto nº4.

Aquí tienes un ejemplo (no lo he probado):
http://www.codeproject.com/Articles/17123/Using-Raw-Input-from-C-to-handle-multiple-keyboard

Saludos








kondrag_X1

muchisimas gracias ya me había enfrascado en diferenciar las pulsaciones de una maquina con un humano, utilizando estadistica.

pero vuestra proposición parece ser bastante interenteresante

le échare un ojo. Saludos