我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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监听快捷键的资料请关注编程网其它相关文章!

免责声明:

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

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

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要为大家详细介绍了WPF实现监听快捷键的几种方式,文中的示例代码讲解详细,具有一定的借鉴与学习价值,需要的可以了解一下
2023-03-20

WPF如何实现监听快捷键

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

Android App实现监听软键盘按键的三种方式

前言: 我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“Go”按键加载url页面;在点击搜索框的时候,点击右下角的search符号键可以进行搜索;或者在全部数据输入
2022-06-06

Android实现向Launcher添加快捷方式的方法

本文实例讲述了Android实现向Launcher添加快捷方式的方法。分享给大家供大家参考。具体如下: 当我们在应用程序Launcher的桌面空白处长按触摸时,会出现一个对话框,提示选择要添加的桌面组件,如下图所示选择快捷方式后,会弹出一个
2022-06-06

Android监听键盘状态获取键盘高度的实现方法

前言 Android暂时还没有提供一个合适的API来获取/监听键盘的状态和高度 , 而我们又经常会有这个需求. 最近我的一个项目中,在ugc页面需要在键盘顶部,紧贴着键盘显示一个文字提示,当键盘消失时就隐藏. 因此,我需要监听软键盘的打开/
2022-06-06

Python创建、删除桌面、启动组快捷方式的例子分享

一、Python创桌面建快捷方式的2个例子 例子一:import osimport pythoncomfrom win32com.shell import shell from win32com.shell import shellc
2022-06-04

Android编程实现向桌面添加快捷方式的方法

本文实例讲述了Android编程实现向桌面添加快捷方式的方法。分享给大家供大家参考,具体如下: 有时候为了使用方便,需要在桌面上添加快捷方式,下面是两种添加快捷方式的方法: 方法1:void setshortCut() {Intent ad
2022-06-06

android编程实现为程序创建快捷方式的方法

本文实例讲述了android编程实现为程序创建快捷方式的方法。分享给大家供大家参考,具体如下: private void addShortcut(){ Intent shortcut = new In
2022-06-06

Android编程实现创建,删除,判断快捷方式的方法

本文实例讲述了Android编程实现创建,删除,判断快捷方式的方法。分享给大家供大家参考,具体如下: private void addShortcut
2022-06-06

android第三方分享方式的简单实现

目前第三方分享方式有两种:1.需要集成官方sdk包,在获得官方授权后调用其api来完成分享到微信、微博等。 优点:无缝集成,功能多 缺点:集成官方sdk包进行开发,且需要申请官方的授权 2.直接调起微信、微博等的activi
2022-06-06

Python协程的2种实现方式分享

在 Python 中,协程(Coroutine)是一种轻量级的并发编程方式,可以通过协作式多任务来实现高效的并发执行。本文主要介绍了Python实现协程的2种方式,希望对大家有所帮助
2023-05-18

怎么用bat实现打开快捷方式指向的目录

这篇文章主要介绍“怎么用bat实现打开快捷方式指向的目录”,在日常操作中,相信很多人在怎么用bat实现打开快捷方式指向的目录问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用bat实现打开快捷方式指向的目录
2023-06-09

Python实现循环语句的方式分享

这篇文章主要为大家详细介绍了Python中实现循环语句的常用方式,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
2023-05-18

Android Studio中快捷键实现try catch等功能包含代码块的实现方法

Android Studio中快捷键实现try catch等功能包含代码块1、windows系统下,只需选中需包含的代码块,按快捷键Ctry+Alt+T即可;2、Ubuntu下由于快捷键已经被占用,故需要自行重新设定,设定过程如下:点击f
2023-05-30

ubuntu下如何实现右键菜单添加新建word、excel文档等快捷方式

小编给大家分享一下ubuntu下如何实现右键菜单添加新建word、excel文档等快捷方式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!步骤 1、打开libreo
2023-06-13

Android截屏一键分享开发与实现方式的反思和总结

本文主要记录android系统截屏一键分享开发,后续优化。 近期接到新需求,需要做截屏,然后弹出小窗口,显示一键分享与截屏小图预览。类似于同花顺app截图弹出框,点击后出现分享界面. 效果图如下:·一,分析该需求的整个流程,大致步骤如下 1
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录