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 ?

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 ?

DDD
DDDoriginal
2025-01-24 05:41:09110parcourir

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.

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

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn