KeyDown/PreviewKeyDown事件中监听Alt键按下
一个坑
在WPF应用程序(或者其他Windows应用程序中),为了监听Alt键按下,我们可以尝试写出这样的代码:
PreviewKeyDown += (s, e) =>
{
if (e.Key == Key.LeftAlt || e.Key == Key.RightAlt)
{
// A: 做些什么。
}
};
然而,运行一看,发现并没有什么用。A处的代码根本就没执行。
打个断点看下,会发现, e.Key 的值是 Key.System 。这就奇怪了, Key.System 是个什么鬼?
一段源码
看看KeyEventArgs中的源码,我们发现微软写了这么个注释:
/// <summary>
/// The Key referenced by the event, if the key is not being
/// handled specially.
/// </summary>
public Key Key
{
get {return _key;}
}
如果按键没有被特殊处理, Key 属性才会返回正确的按键。这么说,当我们按下Alt键时,其实Windows或者WPF某一层特殊处理了这个按键。继续阅读源码,发现这个属性后面还有这样一个属性:
/// <summary>
/// The Key referenced by the event, if the key is going to be
/// processed by an system.
/// </summary>
public Key SystemKey
{
get { return (_key == Key.System) ? _realKey : Key.None;}
}
跟刚刚的 Key 属性相反,这个属性指进行特殊处理时返回的按键。所以,截至这里,问题算是解决了,因为我们可以写出这样的代码:
PreviewKeyDown += (s, e) =>
{
Key key = (e.Key == Key.System ? e.SystemKey : e.Key);
if (key == Key.LeftAlt || key == Key.RightAlt)
{
// A: 做些什么。
}
};
一个解释
然而事情肯定不能这样就结束了,微软为什么要设计这样奇怪的机制?为什么Alt键要成为特殊系统按键?
经过一系列搜索,我找到了解释:
在Windows系统中,Alt键会被特殊处理。当单独按下Alt键,或者按下一个带有Alt的组合键时,操作系统会将此事件视为“系统按键”(System keypress)。系统按键与普通按键相比,其处理过程是不同的。
首先,无论是系统按键还是普通按键,Windows都会将这些事件传递给应用程序。如果是普通按键,则传递 WM_KEYDOWN ,但如果是Alt键,则传递 WM_SYSKEYDOWN ;同理, WM_KEYUP 也会转变成 WM_SYSKEYUP 。
在Windows中(包括WPF中),Alt键如此特殊是为了处理应用程序中那些带有“特殊标记”文字的菜单项(MenuItems)、按钮(Buttons)和其它标签(Labels)的。举个例子,如果按钮的文字内容被设置成“Say _Hi”,那么Alt+H快捷键就会被转变成为一次按钮点击(Click)事件。
这段解释可以在这里http://stackoverflow.com/questions/3099472/previewkeydown-is-not-seeing-alt-modifiers得到更详细的信息。
KeyDown/PreviewKeyDown事件中监听Alt键按下的更多相关文章
- 在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法!
在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法! 其实像按键的监听,我相信很多人都很熟练了,我肯定也不会说这些基础的东西,所以,前期,还是 ...
- Android-服务中监听电源键和Home键的广播、在锁屏下仍然工作的方法
Android-服务中监听电源键和Home键的广播 http://blog.csdn.net/u014657752/article/details/49512485 Android开发之如何监听让服 ...
- vue中监听返回键
问题:在项目中,我们常常有需求,当用户在填写表单时,点击返回的时候,我们希望加一个弹窗,确认离开吗,确认将保存为草稿 解决方案:利用 H5的 pushstate(个人理解为增加页面栈)特性与onpop ...
- iOS 在viewController中监听Home键触发以及重新进入界面的方法
第一步:创建2个NSNotificationCenter监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@sele ...
- Xamarin Android 监听音量键(下)
上篇在 MainActivity 中重写了按键事件(OnKeyDown),获取了音量键键值并打印了出来,当然,手机物理按键和虚拟按键(音量键.返回键.菜单键等)均可通过该按键事件被捕获. 但是,按键重 ...
- Android必知必会-Fragment监听返回键事件
如果移动端访问不佳,请尝试 Github版<–点击左侧 背景 项目要求用户注册成功后进入修改个人资料的页面,且不允许返回到上一个页面,资料修改完成后结束当前页面,进入APP主页. 由于是使用多个 ...
- springboot使用Redis,监听Redis键过期的事件设置与使用代码
我使用的是Windows下的Redis服务,所以一下Redis设置都是在Windows平台进行. 1.修改Redis配置文件 1.1:Windows下的Redis存在两个配置文件 修改带有servic ...
- android fragment轻松监听返回键/Fragment中的popupwindow响应返回键隐藏
现在的开发我们基本上都是一个主activity中放多个fragment,点击返回按钮的时候,直接退出主activity,但是我们在fragment中经常会弹出例如popupWindow这样的布局,用户 ...
- Vue 为什么在 HTML 中监听事件?
为什么在 HTML 中监听事件? 你可能注意到这种事件监听的方式违背了关注点分离(separation of concern)传统理念.不必担心,因为所有的 Vue.js 事件处理方法和表达式都严格绑 ...
随机推荐
- Quartz(自动任务)中的触发器Trigger
1.Quartz中的触发器TriggerJob 包含了要执行任务的逻辑,但是 Job 对何时该执行却一无所知.这个事情留给了 Trigger.Quartz Trigger 继承了抽象的 org.qua ...
- Memcached append 命令
Memcached append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 . 语法: append 命令的基本语法格式如下: append key flags expt ...
- 如何理解nRF5芯片外设PPI
PPI,英文全称Programmable Peripheral Interconnect,是Nordic独有的外设,其设计目的是让CPU处于idle模式下外设与外设之间也能完成相应通信,从而降低系统功 ...
- Uncaught SyntaxError: Unexpected end of input 突然报了这个错
最后排查:把 return true 注掉好了,接着在打开注释,依然不报错.最后不报错了.0.0 ~~~
- 格雷码C++实现
格雷码C++实现 题目 给定一个整数n,请返回n位的格雷码,顺序从0开始,要求递归实现. 格雷码: 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code ...
- Linux命令详解-rmdir
rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.)删除某目录时也必须具有对父目录的写权限. 1.命令 ...
- 【转载】deque双向队列
继vector和queue之后,又发现一个很好用的东西. 本篇转载自http://blog.csdn.net/morewindows/article/details/6946811 deque双向队列 ...
- 利用PXE引导安装centos7
# 利用PXE引导安装centos7 # ###简介### > PXE (Pre-boot Execution Environment,PXE client 在网卡的 ROM 中,当计算机引导时 ...
- hdu 1536&&1944 S-Nim sg函数 难度:0
S-Nim Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- RabbitMQ(2) vhost、用户和权限
rabbitmq中,vhost提供了资源隔离机制.同时,通过为用户设置vhost粒度的权限,可以实现丰富的权限控制功能. vhost 在rabbitmq中,可以创建被称为虚拟主机(vhost)的虚拟消 ...