WPF實現(xiàn)監(jiān)聽快捷鍵的方式分享
1.調(diào)用Win32 API
優(yōu)先級最高,全局監(jiān)聽, 支持最小化失焦等情況
那么,假如我要在一個WPF程序監(jiān)聽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);
//真正注冊快捷鍵監(jiān)聽處理: 同時注冊數(shù)字鍵和小鍵盤的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監(jiān)聽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);
}
2.監(jiān)聽WPF的KeyDown事件
不夠清真,可選擇,最小化失焦等情況監(jiān)聽失效
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事件監(jiān)聽CTRL+5成功"); ;
e.Handled = true;
}
}
3.XAML綁定命令方式
WPF當然優(yōu)先選中命令綁定啦,清真,最小化失焦等情況監(jiān)聽失效
以下為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主窗體后臺代碼創(chuàng)建命令對應的Executed方法
private void Ctrl5Command_OnExecuted(object sender, ExecutedRoutedEventArgs e)
{
Debug.WriteLine("WPF的XAML綁定命令監(jiān)聽CTRL+5成功");
}新增命令相關的靜態(tài)類:
public static class Commands
{
public static ICommand Ctrl5Command { get; } = new RoutedCommand();
}4.細節(jié)
三個監(jiān)聽方案的優(yōu)先級
其中Win32 > XAML綁定命令 = KeyDown事件,假如同時監(jiān)聽的話,其中會只處理高優(yōu)先級的,以上面的例子,假如
我同時監(jiān)聽三個,只會處理win32的
Win32監(jiān)聽CTRL+5成功
全局監(jiān)聽問題
其中win32支持全局監(jiān)聽鍵盤,也就是窗口在失焦情況下,例如最小化,也能監(jiān)聽得到,其中XAML綁定命令和KeyDown事件不支持失焦情況,最小化等情況也就監(jiān)聽不到了,因此,要按業(yè)務選擇方案
5.DEMO
以上就是WPF實現(xiàn)監(jiān)聽快捷鍵的方式分享的詳細內(nèi)容,更多關于WPF監(jiān)聽快捷鍵的資料請關注腳本之家其它相關文章!
相關文章
C#使用Enum.TryParse()實現(xiàn)枚舉安全轉換
這篇文章介紹了C#使用Enum.TryParse()實現(xiàn)枚舉安全轉換的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
C#循環(huán)與循環(huán)控制的表達式樹實現(xiàn)
這篇文章介紹了C#循環(huán)與循環(huán)控制的表達式樹實現(xiàn),文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01

