Maison >développement back-end >C++ >Comment puis-je définir des raccourcis clavier globaux en C# pour déclencher des événements d'application même lorsque l'application n'est pas active ?
Ce code C# crée un raccourci clavier global qui déclenche un événement même lorsque l'application est réduite ou n'est pas mise au point. Améliorons l'explication et la clarté du code pour une meilleure compréhension.
Création de raccourcis clavier globaux en C#
Cet article montre comment implémenter des raccourcis clavier globaux en C# pour répondre aux raccourcis clavier, quel que soit le focus de l'application. Nous nous concentrerons sur l'enregistrement et la gestion des combinaisons comme Ctrl Alt J.
La solution : utiliser user32.dll
La clé pour y parvenir réside dans la bibliothèque user32.dll
, en particulier les fonctions RegisterHotKey
et UnregisterHotKey
. Ces fonctions nécessitent un handle de fenêtre ; par conséquent, cette solution est la mieux adaptée aux applications Windows Forms (WinForms). Les applications console ne disposent pas du contexte de fenêtre nécessaire.
Mise en œuvre du code :
Le code amélioré ci-dessous améliore la lisibilité et comprend des commentaires complets :
<code class="language-csharp">using System; using System.Runtime.InteropServices; using System.Windows.Forms; public sealed class GlobalHotkey : IDisposable { // Import necessary functions from user32.dll [DllImport("user32.dll")] private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); [DllImport("user32.dll")] private static extern bool UnregisterHotKey(IntPtr hWnd, int id); private const int WM_HOTKEY = 0x0312; // Windows message for hotkey events private readonly NativeWindow _window; // Internal window for message handling private int _hotKeyId; // Unique ID for each registered hotkey public GlobalHotkey() { _window = new NativeWindow(); _window.AssignHandle(new CreateParams().CreateHandle()); // Create the window handle _window.WndProc += WndProc; // Assign the window procedure } // Registers a hotkey public void Register(ModifierKeys modifiers, Keys key) { _hotKeyId++; // Generate a unique ID if (!RegisterHotKey(_window.Handle, _hotKeyId, (uint)modifiers, (uint)key)) { throw new Exception("Failed to register hotkey."); } } // Unregisters all hotkeys public void Unregister() { for (int i = 1; i <= _hotKeyId; i++) { UnregisterHotKey(_window.Handle, i); } _window.ReleaseHandle(); // Release the window handle } // Window procedure to handle hotkey messages private void WndProc(ref Message m) { if (m.Msg == WM_HOTKEY) { // Extract key and modifiers from message parameters Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF); ModifierKeys modifiers = (ModifierKeys)((int)m.LParam & 0xFFFF); // Raise the HotkeyPressed event HotkeyPressed?.Invoke(this, new HotkeyPressedEventArgs(modifiers, key)); } } // Event fired when a registered hotkey is pressed public event EventHandler<HotkeyPressedEventArgs> HotkeyPressed; // IDisposable implementation public void Dispose() { Unregister(); _window.Dispose(); } } // Event arguments for HotkeyPressed event public class HotkeyPressedEventArgs : EventArgs { public ModifierKeys Modifiers { get; } public Keys Key { get; } public HotkeyPressedEventArgs(ModifierKeys modifiers, Keys key) { Modifiers = modifiers; Key = key; } } // Enum for hotkey modifiers [Flags] public enum ModifierKeys : uint { None = 0, Alt = 1, Control = 2, Shift = 4, Win = 8 }</code>
Exemple d'utilisation (WinForms) :
<code class="language-csharp">public partial class Form1 : Form { private GlobalHotkey _globalHotkey; public Form1() { InitializeComponent(); _globalHotkey = new GlobalHotkey(); _globalHotkey.HotkeyPressed += GlobalHotkey_HotkeyPressed; _globalHotkey.Register(ModifierKeys.Control | ModifierKeys.Alt, Keys.J); } private void GlobalHotkey_HotkeyPressed(object sender, HotkeyPressedEventArgs e) { // Handle the hotkey press here MessageBox.Show($"Hotkey pressed: Ctrl+Alt+J"); } protected override void OnFormClosing(FormClosingEventArgs e) { _globalHotkey.Dispose(); // Important: Dispose of the hotkey when the form closes base.OnFormClosing(e); } }</code>
N'oubliez pas d'ajouter la gestion des erreurs et de supprimer l'instance GlobalHotkey
correctement (comme indiqué dans OnFormClosing
) pour éviter les fuites de ressources. Ce code révisé fournit une solution plus robuste et plus compréhensible pour gérer les raccourcis clavier globaux dans vos applications C# WinForms.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!