上一篇鸟文中,老周通过史无前例的代码向各位 demo 了访问键的用法(即 Alt + 某某)。不过,大伙伴们一定会发现,访问键毕竟限制较大,不太灵活,也不好发挥,于是就需要自定义快捷键了。

其实,自定义快捷键也不是什么很玄的东西,老周向来不喜欢故弄玄虚,说白了嘛,就是对键盘事件的处理。UWP 与 WPF 有相似处,但也有差异。这些差异是不影响咱们编程的,要是有些差异你就觉得有困难了,那证明你的编程水平实在太差,赶紧回家给党组织写 10 份 800000 字的检讨。

既然是键盘事件了,你首先闭上眼睛,一边养神一边想想,键盘事件会涉及到什么关联的数据呢。首先,程序必须知道哪个键被操作了,是吧,而每个键都有内置的码位的,如虚键码,这个好办,Windows.System.VirtualKey 枚举已经为我们定义好了,所以这个你不必烦心;接着,我们会想到,一个键会有啥操作呢?是了,无非就是按下和松开,即 Key Down和Key Up。

只要以上问题你想通了,那事情就很好弄了,比吃栗子还简单。

UWP的SDK 给我们准备了两个键盘事件:KeyDown在键被按下时发生,KeyUp在键弹起时发生。至于要处理哪个事件,或者是否两个都处理,那就看你要做什么了。

要注意,这两个键盘事件出现在两个地方:

1、UIElement 类公开了这两个事件,这是用于处理用户界面上的元素的键盘行为的,但不包括当前窗口。

2、要在当前窗口层面上处理键盘事件,就要用到 CoreWindow 类,该类也公开这两个键盘事件。调用 GetForCurrentThread 静态方法,可以获取到当前窗口的实例。

Part 1 :简单按键处理

所谓简单按键,就是只按一个键的快捷键。这里我用一例子来演示。

界面上有一个 ListView 控件,里面有四个选项,XAML 如下。

        <ListView Name="lv" Margin="13">
<ListViewItem>飞机</ListViewItem>
<ListViewItem>火车</ListViewItem>
<ListViewItem>自行车</ListViewItem>
<ListViewItem>公交车</ListViewItem>
</ListView>

随后,咱们实现的功能,用F1、F2、F3 和 F4 四个键分别代表选中上面列表控件中的项。如F1选中第一项,F2选中第二项等。

此处,老周选用 CoreWindow 类,即该快捷键是可以在当前窗口范围内捕捉的。

        CoreWindow coreWind = null;
……
coreWind = CoreWindow.GetForCurrentThread();
coreWind.KeyDown += OnWindowKeyDown; ……
private void OnWindowKeyDown(CoreWindow sender, KeyEventArgs args)
{
switch (args.VirtualKey)
{
case Windows.System.VirtualKey.F1:
lv.SelectedIndex = ;
break;
case Windows.System.VirtualKey.F2:
lv.SelectedIndex = ;
break;
case Windows.System.VirtualKey.F3:
lv.SelectedIndex = ;
break;
case Windows.System.VirtualKey.F4:
lv.SelectedIndex = ;
break;
}
}

上面代码很好懂,此处就不解释了,节省600个字。

Part 2 :复合快捷键处理

所谓复合快捷键,就是同时按下两个或两个以上的键,咱们少说P话,还是通过实例来说明吧。这个例子是这样的:在页面上使用 Image 控件显示一张图片,然后,按下【 Ctrl + 加号】来放大图像,按【Ctrl + 减号】来缩小图像。

其中主要的 XAML 如下。

        <Image Source="Assets\1.jpg" Margin="6" RenderTransformOrigin="0.5,0.5" >
<Image.RenderTransform>
<ScaleTransform x:Name="scl" ScaleX="1.0" ScaleY="1.0"/>
</Image.RenderTransform>
</Image>

由于 Image 控件不能接收键盘输入焦点,元素KeyDown和KeyUp事件不能响应,还是考虑用CoreWindow类上的事件。

        CoreWindow coreWind = null;
protected override void OnNavigatedTo(NavigationEventArgs e)
{
coreWind = CoreWindow.GetForCurrentThread();
coreWind.KeyDown += OnKeydown;
coreWind.KeyUp += OnKeyup;
}

这里要特特地声明一个bool类型的变量,用来表示Ctrl键是否按下。

bool Ctrl_down = false;

如果你不想用变量来标志Ctrl键是否按下,也可以访问 CoreWindow 对象的 GetKeyState(Windows.System.VirtualKey) 方法,来检查一下Ctrl 键是否已经按下。不过,老周认这还是直接声明一个变量来保存按键状态更简单。

在KeyUp事件处理中,如果Ctrl键弹起,就让Ctrl_down变量改为 false。

        private void OnKeyup(CoreWindow sender, KeyEventArgs e)
{
if (e.VirtualKey == VirtualKey.Control)
{
Ctrl_down = false;
}
}

在 KeyDown 事件中,分两种情形:a、如果按下的是Ctrl键,就把变量Ctrl_down变量改为 true;b、如果Ctrl键已按下,并且还按了其他键,就要判断一下,是不是按了加号键或减号键。加号键就放大图像,减号键就缩小图像。

        private void OnKeydown(CoreWindow sender, KeyEventArgs e)
{
if (e.VirtualKey == VirtualKey.Control)
{
Ctrl_down = true;
return;
} // 进行缩放处理
if (Ctrl_down)
{
switch (e.VirtualKey)
{
case VirtualKey.Add:
if (scl.ScaleX < 5.0) scl.ScaleX += 0.2;
if (scl.ScaleY < 5.0) scl.ScaleY += 0.2;
break;
case VirtualKey.Subtract:
if (scl.ScaleX > 0.3) scl.ScaleX -= 0.2;
if (scl.ScaleY > 0.3) scl.ScaleY -= 0.2;
break;
}
}
}

现在运行示例,然后自己按【Ctrl + (+)】和【Ctrl + (-)】键试试。

请各位严重注意一下:Key 事件并不记录 Alt 键,该键在 VirtualKey 枚举中用 Menu 表示,这家伙比较另类。它可以从表示按键状态的 CorePhysicalKeyStatus 结构的 IsMenuKeyDown 字段获取。

本文两个示例源代码的下载地址

【Windows 10 应用开发】自定义快捷键的更多相关文章

  1. Windows 10 IoT Serials 1 - 针对Minnow Board MAX的Windows 10 IoT开发环境搭建

    目前,微软针对Windows IoT计划支持的硬件包括树莓派2,Minnow Board MAX 和Galileo (Gen 1和Gen 2).其中,Galileo (Gen 1和Gen 2)运行的是 ...

  2. 打造理想的Windows 10 APP开发环境的5个步骤

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软即将发布Windows 10手机版,实际上很多人现在已经开始在开发Windows ...

  3. Windows 10 UWP开发:如何去掉ListView默认的选中效果

    原文:Windows 10 UWP开发:如何去掉ListView默认的选中效果 开发UWP的时候,很多人会碰到一个问题,就是ListView在被数据绑定之后经常有个默认选中的效果,就像这样: 而且它不 ...

  4. 张高兴的 Windows 10 IoT 开发笔记:使用 ADS1115 读取模拟信号

    考虑到 Raspberry Pi 读取模拟信号是很烦人的事情,更何况是在没人玩的 Windows 10 IoT 下,所以准备正儿八经的写点东西. 需求:使用 Raspberry Pi 读取输出模拟信号 ...

  5. 张高兴的 Windows 10 IoT 开发笔记:使用 Lightning 中的软件 PWM 驱动 RGB LED

    感觉又帮 Windows 10 IoT 开荒了,所以呢,正儿八经的写篇博客吧.其实大概半年前就想写的,那时候想做个基于 Windows 10 IoT 的小车,但树莓派原生不支持 PWM 啊.百度也搜不 ...

  6. 张高兴的 Windows 10 IoT 开发笔记:HC-SR04 超声波测距模块

    HC-SR04 采用 IO 触发测距.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 C# 进行编码. 1. 准备 H ...

  7. 张高兴的 Windows 10 IoT 开发笔记:BH1750FVI 光照度传感器

    BH1750FVI 是一款 IIC 接口的数字型光强度传感器集成电路.下面介绍一下其在 Windows 10 IoT Core 环境下的用法. 项目运行在 Raspberry Pi 2/3 上,使用 ...

  8. 张高兴的 Windows 10 IoT 开发笔记:部署 ASP.NET Core 2 应用

    今天是大年初二,都去走亲戚了吧,享受一下这难得的能和亲友相聚的时光.而我就不一样了,今天一回到家就又开始瞎折腾了,哈哈哈. 问题背景 最近花了点时间用 ASP.NET Core 2 写了个个人博客,中 ...

  9. 张高兴的 Windows 10 IoT 开发笔记:串口红外编解码模块 YS-IRTM

    This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub: https://github.c ...

随机推荐

  1. 【2017-05-04】winfrom进程、线程

    一.进程 一个进程就是一个程序,利用进程可以在一个程序中打开另一个程序. 1.开启某个进程Process.Start("文件缩写名"); 注意:Process要解析命名空间. 2. ...

  2. Struts2之Action接收请求参数和拦截器

    技术分析之在Struts2框架中使用Servlet的API        1. 在Action类中也可以获取到Servlet一些常用的API        * 需求:提供JSP的表单页面的数据,在Ac ...

  3. 解决mysql 服务无法启动问题:Can't find messagefile 'D:\ ools\mysql-5.6.25-winx64\share\errmsg.sys'

    右击我的电脑-->管理,查看Window日志里的应用程序,发现报错. 仔细检查一下my.ini的配置,确保路径正确,楼主的目录如下: 关键的一步,查看my.default文件,加入这样一句:sq ...

  4. python 基础安装使用

    首先我们来学习一下怎么安装python和更新python,再来学习一些简单的解释器.变量.编码内容.循环等代码 第一步开始安装Python环境 安装Python windows: 1 2 3 4 5 ...

  5. 用ajax写分页查询-----2017-05-17

    要写分页,首先你得清楚,一页你想显示多少条信息?如何计算总共显示的页数? 先说一下思路: (1)从数据库读取数据,以chenai表为例,读取所有留言信息.并能够实现输入发送者,可以查询该发送者的留言总 ...

  6. Vue中comoputed中的数据绑定

    Vue中的数据实现响应式绑定是在初始化的时候利用definePrototype的定义set和get过滤器,在进行组件模板编译时实现water的监听搜集依赖项,当数据发生变化时在set中通过调用dep. ...

  7. Hibernate乐观锁、悲观锁和多态

     乐观锁和悲观锁 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁 ...

  8. OBS实现直播解决方案【html实现直播】

    项目的需要,要整一个视频直播,但又不想在其他平台那种直播室盗链展示,那我就直接用播放器来实现rtmp流媒体服务器推流吧!没废话,走起 1.你要有一个媒体服务器,暂时用[盘古云],这个还好,算是不错的平 ...

  9. 用node编写自己的cli工具

    工作中接到新项目,开发前都需要先规划项目目录,然后一个个创建文件,搭建sass编译环境,下载jquery,Swiper等类库... 这些准备工作都要花上不少时间.每做一个项目,都会遇到同样的问题,再重 ...

  10. 开涛spring3(3.4) - DI 之 3.4 Bean的作用域

    3.4  Bean的作用域 什么是作用域呢?即“scope”,在面向对象程序设计中一般指对象或变量之间的可见范围.而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围. ...