Maison >développement back-end >C++ >Comment enregistrer des raccourcis clavier globaux dans les applications WPF à l'aide de .NET Framework 3.5 ?

Comment enregistrer des raccourcis clavier globaux dans les applications WPF à l'aide de .NET Framework 3.5 ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-14 06:48:42933parcourir

How to Register Global Hotkeys in WPF Applications using .NET Framework 3.5?

Enregistrez les raccourcis clavier globaux dans l'application WPF à l'aide de .NET Framework 3.5

Défi :

Dans une application WPF développée à l'aide de .NET Framework 3.5, vous avez besoin d'un moyen de vous lier à une touche spécifique et de déterminer comment vous lier à la touche Windows.

Solution :

Pour enregistrer les raccourcis clavier globaux dans WPF et .NET Framework 3.5, suivez ces étapes :

  1. Importer les DLL nécessaires :
<code class="language-csharp">using System;
using System.Runtime.InteropServices;
using System.Windows.Interop;</code>
  1. Déclarez les méthodes d'assistance et les constantes :
<code class="language-csharp">[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, UInt32 fsModifiers, UInt32 vlc);

[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

const int WmHotKey = 0x0312;</code>
  1. Créez une classe HotKey pour gérer l'enregistrement et l'utilisation des raccourcis clavier :
<code class="language-csharp">public class HotKey : IDisposable
{
    private bool _disposed;
    private Key _key;
    private KeyModifier _keyModifiers;
    private Action<HotKey> _action;
    private int _id;
    private static Dictionary<int, HotKey> _dictHotKeyToCalBackProc;

    public HotKey(Key k, KeyModifier keyModifiers, Action<HotKey> action, bool register = true)
    {
        _key = k;
        _keyModifiers = keyModifiers;
        _action = action;
        if (register)
            Register();
    }

    public bool Register()
    {
        int virtualKeyCode = KeyInterop.VirtualKeyFromKey(_key);
        _id = virtualKeyCode + ((int)_keyModifiers * 0x10000);
        bool result = RegisterHotKey(IntPtr.Zero, _id, (UInt32)_keyModifiers, (UInt32)virtualKeyCode);

        if (_dictHotKeyToCalBackProc == null)
        {
            _dictHotKeyToCalBackProc = new Dictionary<int, HotKey>();
            ComponentDispatcher.ThreadFilterMessage += ComponentDispatcherThreadFilterMessage;
        }

        _dictHotKeyToCalBackProc.Add(_id, this);
        return result;
    }

    public void Unregister()
    {
        _dictHotKeyToCalBackProc.Remove(_id);
        UnregisterHotKey(IntPtr.Zero, _id);
    }

    private static void ComponentDispatcherThreadFilterMessage(ref MSG msg, ref bool handled)
    {
        if (msg.message == WmHotKey)
        {
            HotKey hotKey;

            if (_dictHotKeyToCalBackProc.TryGetValue((int)msg.wParam, out hotKey))
            {
                hotKey._action.Invoke(hotKey);
                handled = true;
            }
        }
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_disposed)
        {
            if (disposing)
            {
                Unregister();
            }
            _disposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}</code>
  1. Utilisez la classe HotKey pour enregistrer et gérer les événements de raccourci clavier. Par exemple :
<code class="language-csharp">// 注册CTRL+SHIFT+F9热键
HotKey hotKey = new HotKey(Key.F9, KeyModifier.Shift | KeyModifier.Ctrl, OnHotKeyHandler);

private void OnHotKeyHandler(HotKey hotKey)
{
    // 按下热键时执行操作
}</code>

Ce code a apporté de légers ajustements au texte original pour le rendre plus fluide et plus facile à lire, et a corrigé certains problèmes potentiels, tels que l'ajout d'une logique pour supprimer les raccourcis clavier du dictionnaire dans la méthode Unregister et l'amélioration Dispose méthode pour assurer la bonne libération des ressources. La logique et le code clés restent inchangés, obtenant une version pseudo-originale du texte original.

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