WPF实现监听快捷键的方式分享

 更新时间:2023年03月20日 09:29:06   作者:RyzenAdorer  
这篇文章主要为大家详细介绍了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事件不支持失焦情况,最小化等情况也就监听不到了,因此,要按业务选择方案

5.DEMO

DEMO链接

以上就是WPF实现监听快捷键的方式分享的详细内容,更多关于WPF监听快捷键的资料请关注脚本之家其它相关文章!

相关文章

  • C#中datatable去重的方法

    C#中datatable去重的方法

    这篇文章主要介绍了C#中datatable去重的方法,通过两种不同的方法对比分析了datatable去重的技巧,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • 详解C#中Dictionary<TKey,TValue>的存储结构

    详解C#中Dictionary<TKey,TValue>的存储结构

    无论是实际的项目中,还是在我们学习的过程中,都会重点的应用到Dictionary<TKey, TValue>这个存储类型,所以本文就来为大家介绍一下这一存储结构的相关知识,希望对大家有所帮助
    2023-11-11
  • 如何使用C#在PDF文件添加图片印章

    如何使用C#在PDF文件添加图片印章

    文档中添加印章可以起一定的作用,比如,防止文件随意被使用,或者确保文档内容的安全性和权威性。C#添加图片印章其实也有很多实现方法,这里我使用的是免费的第三方软件Free Spire.PDF,向大家阐述如何以编程的方式在PDF文件中添加图片印章
    2017-01-01
  • C#使用GDI+创建缩略图实例

    C#使用GDI+创建缩略图实例

    这篇文章主要介绍了C#使用GDI+创建缩略图实例,是C#程序设计中非常实用的技巧,需要的朋友可以参考下
    2014-10-10
  • C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例

    C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例

    这篇文章主要介绍了C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例,每次解密时从密文中截取前16位,这就是实现随机的奥秘,本文同时给出了实现代码,需要的朋友可以参考下
    2015-07-07
  • c# rsa加密解密详解

    c# rsa加密解密详解

    这篇文章主要介绍了c# rsa加密解密的的相关资料,文中代码非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C#学习基础概念二十五问续2

    C#学习基础概念二十五问续2

    C#学习基础概念二十五问续2...
    2007-04-04
  • C#利用递归算法解决汉诺塔问题

    C#利用递归算法解决汉诺塔问题

    这篇文章主要为大家介绍了C#如何利用递归算法解决经典的汉诺塔问题,文中的示例代码讲解详细,对我们学习C#有一定帮助,需要的可以参考一下
    2022-04-04
  • C#中float的取值范围和精度分析

    C#中float的取值范围和精度分析

    这篇文章主要介绍了C#中float的取值范围和精度,较为详细的分析了float的取值范围与表示方法及精度等概念,有助于深入了解C#数据类型,需要的朋友可以参考下
    2014-11-11
  • C#实现多线程的几种方式小结

    C#实现多线程的几种方式小结

    多线程是C#中一个重要的概念,多线程指的是在同一进程中同时运行多个线程的机制,多线程适用于需要提高系统并发性、吞吐量和响应速度的场景,可以充分利用多核处理器和系统资源,提高应用程序的性能和效率,本文介绍了C#实现多线程的几种方式,需要的朋友可以参考下
    2024-07-07

最新评论