您好,登錄后才能下訂單哦!
今天小編給大家分享一下WPF如何實現監聽快捷鍵的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
優先級最高,全局監聽, 支持最小化失焦等情況
那么,假如我要在一個WPF程序監聽CTRL+5按鍵,首先在主窗口程序添加以下代碼:
/// <summary> /// CTRL+5事件Id /// </summary> private const int Ctrl5KeyEventId = 9000; [DllImport("user32.dll")] public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); [DllImport("user32.dll")] public static extern bool UnregisterHotKey(IntPtr hWnd, int id); protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); var handle = new WindowInteropHelper(this).Handle; var source = HwndSource.FromHwnd(handle); source?.AddHook(HwndHook); //真正注冊快捷鍵監聽處理: 同時注冊數字鍵和小鍵盤的CTRL+5 RegisterHotKey(handle, Ctrl5KeyEventId, (uint)ModifierKeys.Control, (uint)KeyInterop.VirtualKeyFromKey(Key.D5)); RegisterHotKey(handle, Ctrl5KeyEventId, (uint)ModifierKeys.Control, (uint)KeyInterop.VirtualKeyFromKey(Key.NumPad5)); } private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { const int wmHotkey = 0x0312; switch (msg) { case wmHotkey: switch (wParam.ToInt32()) { case Ctrl5KeyEventId: Debug.WriteLine("Win32監聽CTRL+5成功"); break; } break; } return IntPtr.Zero; } protected override void OnClosing(CancelEventArgs e) { base.OnClosing(e); var handle = new WindowInteropHelper(this).Handle; //關閉窗口后取消注冊 UnregisterHotKey(handle, Ctrl5KeyEventId); }
不夠清真,可選擇,最小化失焦等情況監聽失效
public MainWindow() { InitializeComponent(); KeyDown += MainWindow_KeyDown; } private void MainWindow_KeyDown(object sender, KeyEventArgs e) { if (Keyboard.Modifiers == ModifierKeys.Control && (e.Key == Key.D5 || e.Key == Key.NumPad5)) { Debug.WriteLine("WPF的KeyDown事件監聽CTRL+5成功"); ; e.Handled = true; } }
WPF當然優先選中命令綁定啦,清真,最小化失焦等情況監聽失效
以下為Window主窗體的XAML代碼
<Window.CommandBindings> <CommandBinding Command="{x:Static local:Commands.Ctrl5Command}" Executed="Ctrl5Command_OnExecuted"/> </Window.CommandBindings> <Window.InputBindings> <KeyBinding Modifiers="Control" Key="D5" Command="{x:Static local:Commands.Ctrl5Command}" /> <KeyBinding Modifiers="Control" Key="NumPad5" Command="{x:Static local:Commands.Ctrl5Command}" /> </Window.InputBindings>
在Window主窗體后臺代碼創建命令對應的Executed方法
private void Ctrl5Command_OnExecuted(object sender, ExecutedRoutedEventArgs e) { Debug.WriteLine("WPF的XAML綁定命令監聽CTRL+5成功"); }
新增命令相關的靜態類:
public static class Commands { public static ICommand Ctrl5Command { get; } = new RoutedCommand(); }
三個監聽方案的優先級
其中Win32 > XAML綁定命令 = KeyDown事件,假如同時監聽的話,其中會只處理高優先級的,以上面的例子,假如
我同時監聽三個,只會處理win32的
Win32監聽CTRL+5成功
全局監聽問題
其中win32支持全局監聽鍵盤,也就是窗口在失焦情況下,例如最小化,也能監聽得到,其中XAML綁定命令和KeyDown事件不支持失焦情況,最小化等情況也就監聽不到了,因此,要按業務選擇方案。
以上就是“WPF如何實現監聽快捷鍵”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。