2010-08-09 26 views
5

He escrito una aplicación con un simple cuadro de texto que intenta identificar a un usuario de sus hábitos de escritura (intervalo entre pulsaciones de teclas, tecla de duración se mantiene, tiempo entre teclas, es decir, a-> s es más rápido que a-> v para algunos usuarios, más corto para otros dependiendo del estilo de escritura). Está lejos de ser perfecto, pero identifica correctamente las diferencias moderadas-grandes en el estilo.Capture todos los eventos de teclado usando VB.Net

Espero utilizar esto como una forma de monitor de seguridad: si el estilo de tipeo del usuario no se ajusta a un patrón reconocido, informe a un servidor central.

Por supuesto, el siguiente paso en la prueba de esto es comenzar a capturar hábitos "normales" de escritura - es decir, cuando se navega, el cambio entre aplicaciones, etc.

Lo que no puedo encontrar la manera de hacer es la captura entrada de teclado para todas las aplicaciones (excluyendo el/la pantalla de bienvenida de inicio de sesión, escritorios alternativos, etc. - no tengo ninguna razón para analizar eso y probablemente no haya suficiente de entrada para analizar todos modos)

responsabilidad: Sí, sé que esto se acerca peligrosamente a la escritura de un keylogger que está prohibido, pero si quisiera hacerlo escribiría un controlador de teclado en C++, estoy seguro de que lo haría ser mucho más racionalizado y más fácil de ocultar que un ensamblaje .Net MSIL descomunal. No tengo dudas de que me defenderé de los comentarios de "That's a keylogger" pero me he topado con una pared y necesito preguntar en alguna parte ...

No necesito que la aplicación esté oculta, pero lo ideal sería me gusta poder capturar entrada sin confirmación explícita del usuario (más allá de la instalación por un administrador) - Si se requiere confirmación del usuario, puedo vivir con eso (solo) si puede ser único y tengo alguna forma de monitorear e informar negaciones .

¿Esto es posible incluso en .Net? Los únicos ejemplos que he podido encontrar operan al agregar un gancho de evento a cada tecla que parece torpe y me imagino que es propenso a errores. -o bien - sondean el estado del teclado para determinar las teclas presionadas. Esto no es bueno para mí como a) Necesito sincronizaciones exactas de pulsaciones de teclas para que los eventos de tecla arriba/abajo sean obligatorios yb) sea desagradable.

No me sorprendería si el marco está diseñado específicamente para prohibir esto en cuyo caso tendré que recurrir a algún código no administrado para proporcionar los eventos. Obviamente preferiría usar código administrado en todo momento.

Cualquier ayuda apreciada.

Editar: Gracias a la respuesta de Hans Passant, este es el mejor recurso que he encontrado hasta el momento: http://www.codeguru.com/columns/vb/article.php/c4831

Respuesta

5

Google + SetWindowsHookExWH_KEYBOARD_LL, palabras clave que Google también. Eso establece un gancho de teclado de bajo nivel. No es un gancho global, por lo que puede funcionar en un programa VB.NET.

+0

Muchas gracias, parece que es exactamente lo que necesito. ¿Sabe usted si eso también captaría las pulsaciones "simuladas", por ejemplo, desde un escáner de código de barras o un lector de tarjetas? Idealmente, me gustaría evitar capturarlos (pero probablemente pueda evitarlo si es así, ya que "escriben" muy rápido ya una velocidad constante) – Basic

+0

Mientras usen SendInput (como deberían) entonces, sí, tú " Yo también lo veré –

0

.NET no proporciona ningún servicio de ese tipo, por lo que tendrá que ir más bajo y usa p/invoke. Las opciones son:

  • Win engancha
  • sondeo utilizando GetAsyncKeyState
+0

Como se mencionó, no creo que las encuestas sean suficientes, ya que necesito la información del evento clave con el tiempo más preciso posible, y o sondear REALMENTE RÁPIDO (es decir, CPU poco razonable para una pequeña tarea de fondo) o más tranquilamente, en cuyo caso Pierdo resolución de tiempo. Con respecto a Win Hooks, ¿a qué se refiere exactamente? Ganchos clave globales? – Basic

Cuestiones relacionadas