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 事件处理方法和表达式都严格绑 ...
随机推荐
- 分享几道Java线程面试题
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...
- WPF 回车转Tab实现跳转
1.重写窗体的KeyDown事件 protected override void OnKeyDown(KeyEventArgs e) { if (e.Key == Key.Enter) { // Mo ...
- IOS-下载动画
就2小时教会你抽丝剥茧CAAnimation核心动画之精美的下载动画 header 设计灵感 设计此效果的作者 Nick; images 开始之前你需要了解的 先上一张CAAnimation层次图: ...
- day20 project+查看新闻列表 + 点赞 + 图片验证码 + 评论和多级评论 + 后台管理 + webSocket + kindEditor
Day20回顾: 1. 请求生命周期 2. 中间件 md = [ "file_path.classname" ] process_request[可有可无] process_res ...
- CentOS上部署Django+Nginx+Uwsgi环境
在CentOS上部署Django+Nginx+Uwsgi环境 奇谭 2016-09-01 评论 Linux python django nginx uwsgi VirtualEnv的作用:创建隔 ...
- Linux 忘记密码解决方法,Linux 远程登录
一.Linux 忘记密码解决方法 很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步 ...
- Find the Longest Word in a String
找到提供的句子中最长的单词,并计算它的长度. 函数的返回值应该是一个数字. 这是一些对你有帮助的资源: String.split() String.length 第一种想法就是,先定一个小变量,来他一 ...
- map、filter、reduce、lambda
一.map.filter.reduce map(fuction , iterable) 映射 对可迭代对象中的每一项,使用函数去改变 filter(function, iterable) 过滤 可迭代 ...
- Python中列表生成式和字典生成式练习
(一)列表生成式 练习一:编写名为collatz(number)的函数:实现的功能:参数为偶数时,打印number// 2;参数为奇数时,打印3*number + 1 解析: number = int ...
- pig 自定义udf中读取hdfs 文件
最近几天,在研究怎么样把日志中的IP地址转化成具体省份城市. 希望写一个pig udf IP数据库采用的纯真IP数据库文件qqwry.dat,可以从http://www.cz88.net/下载. 这里 ...