文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

WPF如何实现监听快捷键

2023-07-05 14:15

关注

今天小编给大家分享一下WPF如何实现监听快捷键的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

1.调用Win32 API

优先级最高,全局监听, 支持最小化失焦等情况

那么,假如我要在一个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);        }

2.监听WPF的KeyDown事件

不够清真,可选择,最小化失焦等情况监听失效

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;            }        }

3.XAML绑定命令方式

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();    }

4.细节

三个监听方案的优先级

其中Win32 > XAML绑定命令 = KeyDown事件,假如同时监听的话,其中会只处理高优先级的,以上面的例子,假如

我同时监听三个,只会处理win32的

Win32监听CTRL+5成功

全局监听问题

其中win32支持全局监听键盘,也就是窗口在失焦情况下,例如最小化,也能监听得到,其中XAML绑定命令和KeyDown事件不支持失焦情况,最小化等情况也就监听不到了,因此,要按业务选择方案。

以上就是“WPF如何实现监听快捷键”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯