Heim > Backend-Entwicklung > C++ > Wie kann ich in C# globale Hotkeys festlegen, um Anwendungsereignisse auszulösen, auch wenn die Anwendung nicht im Fokus ist?

Wie kann ich in C# globale Hotkeys festlegen, um Anwendungsereignisse auszulösen, auch wenn die Anwendung nicht im Fokus ist?

DDD
Freigeben: 2025-01-24 05:41:09
Original
103 Leute haben es durchsucht

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.

How can I set global hotkeys in C# to trigger application events even when the application is not in focus?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage