Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mendaftar Hotkey Global dalam Aplikasi WPF menggunakan .NET Framework 3.5?

Bagaimana untuk Mendaftar Hotkey Global dalam Aplikasi WPF menggunakan .NET Framework 3.5?

Patricia Arquette
Patricia Arquetteasal
2025-01-14 06:48:42931semak imbas

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

Daftar hotkey global dalam aplikasi WPF menggunakan .NET Framework 3.5

Cabaran:

Dalam aplikasi WPF yang dibangunkan menggunakan .NET Framework 3.5, anda memerlukan cara untuk mengikat pada tekanan kekunci tertentu dan menentukan cara untuk mengikat kekunci Windows.

Penyelesaian:

Untuk mendaftar kekunci pintas global dalam WPF dan .NET Framework 3.5, ikut langkah berikut:

  1. Import DLL yang diperlukan:
<code class="language-csharp">using System;
using System.Runtime.InteropServices;
using System.Windows.Interop;</code>
  1. Isytihar kaedah pembantu dan pemalar:
<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. Buat kelas HotKey untuk mengurus pendaftaran dan penggunaan hotkey:
<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. Gunakan kelas HotKey untuk mendaftar dan mengendalikan acara hotkey. Contohnya:
<code class="language-csharp">// 注册CTRL+SHIFT+F9热键
HotKey hotKey = new HotKey(Key.F9, KeyModifier.Shift | KeyModifier.Ctrl, OnHotKeyHandler);

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

Kod ini telah membuat sedikit pelarasan pada teks asal untuk menjadikannya lebih lancar dan mudah dibaca serta telah membetulkan beberapa masalah yang mungkin berlaku, seperti menambah logik untuk mengalih keluar kekunci pintas daripada kamus dalam kaedah Unregister dan menambah baik Dispose kaedah untuk memastikan pelepasan sumber yang betul. Logik dan kod utama kekal tidak berubah, mencapai versi pseudo-asli teks asal.

Atas ialah kandungan terperinci Bagaimana untuk Mendaftar Hotkey Global dalam Aplikasi WPF menggunakan .NET Framework 3.5?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn