Dieser C#-Code erstellt einen globalen Hotkey, der ein Ereignis auslöst, selbst wenn die Anwendung minimiert oder nicht im Fokus ist. Lassen Sie uns die Erklärung und die Klarheit des Codes verbessern, um das Verständnis zu verbessern.
Globale Hotkeys in C# erstellen
In diesem Artikel wird gezeigt, wie Sie globale Hotkeys in C# implementieren, um unabhängig vom Anwendungsfokus auf Tastaturkürzel zu reagieren. Wir konzentrieren uns auf die Registrierung und Handhabung von Kombinationen wie Strg Alt J.
Die Lösung: Verwendung von user32.dll
Der Schlüssel dazu liegt in der user32.dll
-Bibliothek, insbesondere in den Funktionen RegisterHotKey
und UnregisterHotKey
. Für diese Funktionen ist ein Fensterhandle erforderlich. Daher eignet sich diese Lösung am besten für Windows Forms-Anwendungen (WinForms). Konsolenanwendungen fehlt der notwendige Fensterkontext.
Code-Implementierung:
Der verbesserte Code unten verbessert die Lesbarkeit und enthält umfassende Kommentare:
<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>
Beispielverwendung (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>
Denken Sie daran, eine Fehlerbehandlung hinzuzufügen und die GlobalHotkey
-Instanz ordnungsgemäß zu entsorgen (wie in OnFormClosing
gezeigt), um Ressourcenlecks zu verhindern. Dieser überarbeitete Code bietet eine robustere und verständlichere Lösung für die Verwaltung globaler Hotkeys in Ihren C#-WinForms-Anwendungen.
Das obige ist der detaillierte Inhalt vonWie kann ich in C# globale Hotkeys festlegen, um Anwendungsereignisse auszulösen, auch wenn die Anwendung nicht im Fokus ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!