una teclas tecla sirve que pulsacion presionar presionada para net evento detectar combinacion capturar c# keyboard

c# - teclas - evento al presionar una tecla vb net



C#Detecta la tecla ESC presionar en cualquier lugar (3)

Use esta clase:

using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; namespace myNameSpace { class InterceptKeys { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private const int WM_ALTDOWN = 0x0104; private static LowLevelKeyboardProc _proc = HookCallback; private static IntPtr _hookID = IntPtr.Zero; public static void Start() { _hookID = SetHook(_proc); } public static void Stop() { UnhookWindowsHookEx(_hookID); } public static event KeyEventHandler OnKeyDown; private static IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private delegate IntPtr LowLevelKeyboardProc( int nCode, IntPtr wParam, IntPtr lParam); private static IntPtr HookCallback( int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_ALTDOWN)) { var vkCode = (Keys)Marshal.ReadInt32(lParam); OnKeyDown(null, new KeyEventArgs(vkCode)); } return CallNextHookEx(_hookID, nCode, wParam, lParam); } [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [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); } }

De este modo:

myNameSpace.InterceptKeys.OnKeyDown+= new KeyEventHandler(myKeyDown); myNameSpace.InterceptKeys.Start();

que onKeyDown puede ser así:

void myKeyDown(object sender, KeyEventArgs e) { // Some code for closing you form // or any thing you need after press Esc // with e.KeyCode };

Tengo una aplicación en ventana C # en ejecución y quiero cerrarla cuando presiono ESC desde cualquier lugar, incluso cuando mi aplicación no tiene foco. ¿Cómo puedo implementar esto?

Encontré un teclado de conexión que es de control de bajo nivel y no tengo ni idea ni entiendo.



Para aquellos que buscan una solución completa para detectar pulsaciones de teclas globales y también para presionar teclas, lo he calculado todo y puse el código en pastebin.com para "nunca" ser eliminado. Note especialmente InterceptKeys.cs aquí (haga Ctrl + F):

http://pastebin.com/u7FUhgYr

^ Este código está completo, pero no es óptimo.

Luego, mejoré un poco el código (un cambio es la nueva función SendKeys que creé, que envía las pulsaciones / liberaciones de teclas que desee, ¡mucho más fáciles de usar!). Esta clase aquí, MakroKeys:

http://pastebin.com/Dedx6hRw

tiene dos funciones estáticas que se pueden usar para convertir de cadena a System.Windows.Forms.Keys y viceversa (lo cual sería útil si desea que el usuario pueda ingresar su propia clave a través del texto y / o mostrar la información actualmente presionada) clave a través del texto); y esto tiene el código MainForm.cs mejorado para ir con él (que contiene la función SendKeys):

http://pastebin.com/BXzmWeMK

(Observe la llamada MakroKeys.GetKey ("lcontrolkey"), que demuestra el uso de esa funcionalidad).

Con todo esto combinado, puedes hacer cosas increíbles. Tenga en cuenta también que, debido a que esto es importar archivos DLL y llamar a funciones de la API de Windows, puede hacerlo fácilmente, por ejemplo, también en c ++. De nada, mundo. ;)