2011-07-21 21 views
5

Básicamente quiero registrar cada pulsación de tecla (incluidos los clics de tecla/tecla y ratón) y cuándo ocurrieron para poder crear una macro de ellos.¿Cómo grabar teclas presionadas?

Encontré un montón de cosas sobre pulsaciones de teclas y WinForms o WPF, pero realmente no necesito una GUI, solo quiero descargarla en la consola después de que haya terminado de procesarla.

Entonces, ¿cómo puedo registrar todas las pulsaciones de teclas, incluso cuando la ventana de mi consola no tiene foco?


Salida de ejemplo:

Send {q down} 
Sleep 98 
Send {q up} 
Sleep 4 
Send {f down} 
Sleep 102 
Send {f up} 
Sleep 43 
Send {a down} 
Sleep 26 
Send {s down} 
Sleep 111 
Send {a up} 
Sleep 18 
Send {s up} 
Sleep 17 
Send {a down} 
Sleep 62 
Send {space down} 
Sleep 72 
Send {a up} 
Sleep 5 
Send {space up} 

El uso de WPF por ahora, pero el campo de texto de entrada tiene que estar centrado. Prefiero ser capaz de grabar las teclas mientras estoy en mi juego, de ahí la pregunta :)

+0

escribiendo un keylogger? –

+1

esto podría ayudar: http: //msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress.aspx#Y435 –

+0

@Jesus: Supongo que califica como registrador de pulsaciones, sí. – mpen

Respuesta

1

Eche un vistazo a la función SetWindowsHookEx. Esto se puede usar para controlar las pulsaciones de teclas en todo el sistema.

1

Por lo que sé, para lograr esto tendrá que engancharse a la API de Win32.

Este project puede ayudarlo a comenzar.

1

probar esto

[DllImport("user32.dll")] 
static extern IntPtr SetWindowsHookEx 
    (int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId); 
1

puede utilizar HwndSource.FromHwnd método para devolver un HwndSource para

una ventana donde HwndSource representa WPFcontent dentro de una ventana de Win32

Entonces método AddHook se utiliza para añadir un método de devolución de llamada llamado CallBackMethod,

que será recibir todos los mensajes de la ventana. Para ello, el siguiente código se ha utilizado:

HwndSource windowSpecificOSMessageListener = HwndSource.FromHwnd(new 
WindowInteropHelper(this).Handle); 
windowSpecificOSMessageListener.AddHook(new HwndSourceHook(CallBackMethod)); 

En el método de devolución de llamada, todos los mensajes del sistema operativo de esta ventana específica que se recibe.

private IntPtr CallBackMethod(IntPtr hwnd, 
int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    // msg can be WM_KEYDOWN = 0x0100, WM_KEYUP = 0x0101 and so forth. 
    // Add you code 
}