Registrieren Sie globale Hotkeys in der WPF-Anwendung mit .NET Framework 3.5
Herausforderung:
In einer WPF-Anwendung, die mit .NET Framework 3.5 entwickelt wurde, benötigen Sie eine Möglichkeit, eine Bindung an einen bestimmten Tastendruck herzustellen und zu bestimmen, wie eine Bindung an die Windows-Taste erfolgen soll.
Lösung:
Um globale Hotkeys in WPF und .NET Framework 3.5 zu registrieren, führen Sie die folgenden Schritte aus:
<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>
Dieser Code hat geringfügige Anpassungen am Originaltext vorgenommen, um ihn flüssiger und leichter lesbar zu machen, und einige potenzielle Probleme behoben, z. B. das Hinzufügen einer Logik zum Entfernen von Hotkeys aus dem Wörterbuch in der Unregister
-Methode und die Verbesserung von Dispose
Methode zur Sicherstellung der korrekten Ressourcenfreigabe. Die Schlüssellogik und der Code bleiben unverändert, wodurch eine Pseudo-Originalversion des Originaltextes entsteht.
Das obige ist der detaillierte Inhalt vonWie registriere ich globale Hotkeys in WPF-Anwendungen mit .NET Framework 3.5?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!