Establezca teclas rápidas globales usando C #

Necesito capturar una tecla cuando mi progtwig no está enfocado. (es decir, Ctrl + Alt + J ) y desencadenar un evento en mi progtwig.

Hasta ahora he encontrado esta dll que parece ser la ruta correcta ”

[DllImport("user32.dll")]private static extern int RegisterHotKey(IntPtr hwnd, int id,int fsModifiers, int vk); [DllImport("user32.dll")] private static extern int UnregisterHotKey(IntPtr hwnd, int id); 

Tenga en cuenta que este código no desencadenará eventos en proyectos de aplicaciones de consola. Tienes que usar el proyecto WinForms para que los eventos se disparen.

Este es el código correcto:

 public sealed class KeyboardHook : IDisposable { // Registers a hot key with Windows. [DllImport("user32.dll")] private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); // Unregisters the hot key with Windows. [DllImport("user32.dll")] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); ///  /// Represents the window that is used internally to get the messages. ///  private class Window : NativeWindow, IDisposable { private static int WM_HOTKEY = 0x0312; public Window() { // create the handle for the window. this.CreateHandle(new CreateParams()); } ///  /// Overridden to get the notifications. ///  ///  protected override void WndProc(ref Message m) { base.WndProc(ref m); // check if we got a hot key pressed. if (m.Msg == WM_HOTKEY) { // get the keys. Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF); ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF); // invoke the event to notify the parent. if (KeyPressed != null) KeyPressed(this, new KeyPressedEventArgs(modifier, key)); } } public event EventHandler KeyPressed; #region IDisposable Members public void Dispose() { this.DestroyHandle(); } #endregion } private Window _window = new Window(); private int _currentId; public KeyboardHook() { // register the event of the inner native window. _window.KeyPressed += delegate(object sender, KeyPressedEventArgs args) { if (KeyPressed != null) KeyPressed(this, args); }; } ///  /// Registers a hot key in the system. ///  /// The modifiers that are associated with the hot key. /// The key itself that is associated with the hot key. public void RegisterHotKey(ModifierKeys modifier, Keys key) { // increment the counter. _currentId = _currentId + 1; // register the hot key. if (!RegisterHotKey(_window.Handle, _currentId, (uint)modifier, (uint)key)) throw new InvalidOperationException("Couldn't register the hot key."); } ///  /// A hot key has been pressed. ///  public event EventHandler KeyPressed; #region IDisposable Members public void Dispose() { // unregister all the registered hot keys. for (int i = _currentId; i > 0; i--) { UnregisterHotKey(_window.Handle, i); } // dispose the inner native window. _window.Dispose(); } #endregion } ///  /// Event Args for the event that is fired after the hot key has been pressed. ///  public class KeyPressedEventArgs : EventArgs { private ModifierKeys _modifier; private Keys _key; internal KeyPressedEventArgs(ModifierKeys modifier, Keys key) { _modifier = modifier; _key = key; } public ModifierKeys Modifier { get { return _modifier; } } public Keys Key { get { return _key; } } } ///  /// The enumeration of possible modifiers. ///  [Flags] public enum ModifierKeys : uint { Alt = 1, Control = 2, Shift = 4, Win = 8 } 

usar (tuve que editar las teclas modificadoras para convertirlas (modificador) 1 (modificador) 2 etc.

 public partial class Form1 : Form { KeyboardHook hook = new KeyboardHook(); public Form1() { InitializeComponent(); // register the event that is fired after the key press. hook.KeyPressed += new EventHandler(hook_KeyPressed); // register the control + alt + F12 combination as hot key. hook.RegisterHotKey(ModifierKeys.Control | ModifierKeys.Alt, Keys.F12); } void hook_KeyPressed(object sender, KeyPressedEventArgs e) { // show the keys pressed in a label. label1.Text = e.Modifier.ToString() + " + " + e.Key.ToString(); } } 

Aquí hay un puerto vb.net de respuesta original :

KeyboardHook.vb

 Imports System.Runtime.InteropServices Public NotInheritable Class KeyboardHook Implements IDisposable ' Registers a hot key with Windows.  _ Private Shared Function RegisterHotKey(hWnd As IntPtr, id As Integer, fsModifiers As UInteger, vk As UInteger) As Boolean End Function ' Unregisters the hot key with Windows.  _ Private Shared Function UnregisterHotKey(hWnd As IntPtr, id As Integer) As Boolean End Function '''  ''' Represents the window that is used internally to get the messages. '''  Private Class Window Inherits NativeWindow Implements IDisposable Private Shared WM_HOTKEY As Integer = &H312 Public Sub New() ' create the handle for the window. Me.CreateHandle(New CreateParams()) End Sub Public Event KeyPressed As EventHandler(Of KeyPressedEventArgs) '''  ''' Overridden to get the notifications. '''  '''  Protected Overrides Sub WndProc(ByRef m As Message) MyBase.WndProc(m) ' check if we got a hot key pressed. If m.Msg = WM_HOTKEY Then ' get the keys. Dim key As Keys = DirectCast((CInt(m.LParam) >> 16) And &HFFFF, Keys) Dim modifier As ModifierKeys = DirectCast(CUInt(CInt(m.LParam) And &HFFFF), ModifierKeys) ' invoke the event to notify the parent. RaiseEvent KeyPressed(Me, New KeyPressedEventArgs(modifier, key)) End If End Sub #Region " IDisposable Members" Public Sub Dispose() Implements IDisposable.Dispose Me.DestroyHandle() End Sub #End Region End Class Private _window As New Window() Private _currentId As Integer Public Sub New() ' register the event of the inner native window. AddHandler _window.KeyPressed, Sub(sender As Object, args As KeyPressedEventArgs) RaiseEvent KeyPressed(Me, args) End Sub End Sub '''  ''' Registers a hot key in the system. '''  ''' The modifiers that are associated with the hot key. ''' The key itself that is associated with the hot key. Public Sub RegisterHotKey(modifier As ModifierKeys, key As Keys) ' increment the counter. _currentId = _currentId + 1 ' register the hot key. If Not RegisterHotKey(_window.Handle, _currentId, DirectCast(modifier, UInteger), CUInt(key)) Then 'Throw New InvalidOperationException("Couldn't register the hot key.") 'or use MsgBox("Couldn't register the hot key.") End If End Sub '''  ''' A hot key has been pressed. '''  Public Event KeyPressed As EventHandler(Of KeyPressedEventArgs) #Region " IDisposable Members" Public Sub Dispose() Implements IDisposable.Dispose ' unregister all the registered hot keys. Dim i As Integer = _currentId While i > 0 UnregisterHotKey(_window.Handle, i) System.Math.Max(System.Threading.Interlocked.Decrement(i), i + 1) End While ' dispose the inner native window. _window.Dispose() End Sub #End Region End Class '''  ''' Event Args for the event that is fired after the hot key has been pressed. '''  Public Class KeyPressedEventArgs Inherits EventArgs Private _modifier As ModifierKeys Private _key As Keys Friend Sub New(modifier As ModifierKeys, key As Keys) _modifier = modifier _key = key End Sub Public ReadOnly Property Modifier() As ModifierKeys Get Return _modifier End Get End Property Public ReadOnly Property Key() As Keys Get Return _key End Get End Property End Class '''  ''' The enumeration of possible modifiers. '''   _ Public Enum ModifierKeys As UInteger Alt = 1 Control = 2 Shift = 4 Win = 8 End Enum 

Form1.vb

Tareas:

  1. Reemplace 2 instancias de la Application1 continuación con el nombre de su aplicación (se puede ver como la raíz del árbol en la ventana del Explorador de soluciones de Visual Studio).
  2. Agregue una llamada a AddGlobalHotkeySupport() en la etapa de inicialización de su aplicación.
  3. Agregue la llamada a RemoveGlobalHotkeySupport() en la etapa de finalización de su aplicación.

Código:

 Public Sub AddGlobalHotkeySupport() 'TODO: call this at initialization of the application ' register the event that is fired after the key press. AddHandler hook.KeyPressed, AddressOf hook_KeyPressed ' register the control + alt + F12 combination as hot key. hook.RegisterHotKey(Application1.ModifierKeys.Control Or Application1.ModifierKeys.Alt, Keys.F12) End Sub Public Sub RemoveGlobalHotkeySupport() 'TODO: call this at finalization of the application ' unregister all registered hot keys. hook.Dispose() End Sub Private Sub hook_KeyPressed(sender As Object, e As KeyPressedEventArgs) ' show the keys pressed in a label. MsgBox(e.Modifier.ToString() + " + " + e.Key.ToString()) End Sub