Maison >développement back-end >C++ >Comment enregistrer des raccourcis clavier globaux dans les applications WPF à l'aide de .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 :
<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>
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!