c# keyboard console-application user32

c# - Obtenga la clave de cualquier proceso



keyboard console-application (3)

Ah, entonces ¿estás buscando "Autofire" en los términos de juego de la vieja escuela?

En lugar de escribir su propia aplicación de gancho de teclado (a menos que lo haga por diversión / la emoción de ello / el ejercicio) es posible que desee ver AutoIt o AutoHotkey, que son ambos bastante buenos para la automatización de teclado / mouse.

Vea este hilo, por ejemplo ... http://www.autohotkey.com/board/topic/40598-autofire-keyboard/

He visto muchas soluciones en línea pero ninguna hace exactamente lo que quiero. ¿Cuál es la mejor y más simple forma de presionar cualquier tecla en un proceso determinado (no en mi aplicación de consola) mientras mi aplicación se ejecuta en segundo plano? No necesito los modificadores ni nada.


Lo que estás buscando se llama un gancho de teclado global. Puede encontrar más información y ejemplos en MSDN .


Si no le interesa particularmente en qué proceso se presionan las teclas, el método más fácil sería llamar a GetAsyncKeyState . Sin embargo, es bastante limitado, ya que no engancha el teclado y requiere que lo llame continuamente. El mejor enfoque en mi opinión es conectar el teclado.

Usando SetWindowsHookEx puedes especificar explícitamente el identificador del hilo con el que se asociará el procedimiento hook para que puedas enganchar claves para un proceso específico (ver dwThreadId ).

Aquí hay una clase que puedes usar (originalmente encontrada en un blog de Micrsoft pero parece que no puedo encontrar el nombre de los autores en este momento).

public delegate IntPtr KeyboardProcess(int nCode, IntPtr wParam, IntPtr lParam); public sealed class KeyboardHook { public static event EventHandler<KeyPressedEventArgs> KeyPressed; private const int WH_KEYBOARD = 13; private const int WM_KEYDOWN = 0x0100; private static KeyboardProcess keyboardProc = HookCallback; private static IntPtr hookID = IntPtr.Zero; public static void CreateHook() { hookID = SetHook(keyboardProc); } public static void DisposeHook() { UnhookWindowsHookEx(hookID); } private static IntPtr SetHook(KeyboardProcess keyboardProc) { using (Process currentProcess = Process.GetCurrentProcess()) using (ProcessModule currentProcessModule = currentProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD, keyboardProc, GetModuleHandle(currentProcessModule.ModuleName), 0); } } private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN) { int vkCode = Marshal.ReadInt32(lParam); if (KeyPressed != null) KeyPressed(null, new KeyPressedEventArgs((Keys)vkCode)); } return CallNextHookEx(hookID, nCode, wParam, lParam); } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, KeyboardProcess lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); } public class KeyPressedEventArgs : EventArgs { public Keys KeyCode { get; set; } public KeyPressedEventArgs(Keys Key) { KeyCode = Key; } }

Implementación a través de la aplicación de consola:

class Program { static void Main(string[] args) { KeyboardHook.CreateHook(); KeyboardHook.KeyPressed += KeyboardHook_KeyPressed; Application.Run(); KeyboardHook.DisposeHook(); } static void KeyboardHook_KeyPressed(object sender, KeyPressedEventArgs e) { Console.WriteLine(e.KeyCode.ToString()); } }