Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: kondrag_X1 en 12 Abril 2015, 19:09 pm



Título: Diferenciar eventos según teclado C#
Publicado por: kondrag_X1 en 12 Abril 2015, 19:09 pm
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.


Título: Re: Diferenciar eventos según teclado C#
Publicado por: fran800m en 16 Abril 2015, 20:55 pm
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,


Título: Re: Diferenciar eventos según teclado C#
Publicado por: Eleкtro en 17 Abril 2015, 00:06 am
en 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


Título: Re: Diferenciar eventos según teclado C#
Publicado por: kondrag_X1 en 22 Abril 2015, 15:50 pm
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