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:
<code class="language-csharp">using System; using System.Runtime.InteropServices; using System.Windows.Interop;</code>
<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>
<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>
<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!