.NET Framework 3.5 を使用して WPF アプリケーションにグローバル ホットキーを登録する
チャレンジ:
.NET Framework 3.5 を使用して開発された WPF アプリケーションでは、特定のキー押下にバインドし、Windows キーにバインドする方法を決定する方法が必要です。
解決策:
WPF および .NET Framework 3.5 でグローバル ホットキーを登録するには、次の手順に従います。
<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>
このコードは、元のテキストにわずかな調整を加えて、よりスムーズで読みやすくし、Unregister
メソッドの辞書からホットキーを削除するロジックの追加や リソースの正しいリリースを保証するためのメソッド。 主要なロジックとコードは変更されず、原文の疑似オリジナル バージョンが実現されます。 Dispose
以上が.NET Framework 3.5 を使用して WPF アプリケーションにグローバル ホットキーを登録する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。