Winform下KeyDown,KeyPress,KeyUp事件的总结(转)
原文: http://www.cnblogs.com/xiashengwang/archive/2011/09/15/2578798.html
在winform程序中,经常会用到这几个事件用于控制数字输入,按键动作等操作,但一直没有完全弄清楚他们之间的区别和联系,到底什么时候用哪一个事件合适,闲暇无事,做了一个小小的总结,以免以后犯糊涂。
1) 这三个事件调用的先后顺序(MSDN)
1. KeyDown :在控件有焦点的情况下按下键时发生
2. KeyPress :在控件有焦点的情况下按下键时发生。
3. KeyUp :在控件有焦点的情况下释放键时发生。
2) KeyDown和KeyPress在MSDN上的解释完全一样,都是在按下键的时候发生,那区别是什么呢?
- textBox1_KeyDown(object sender, KeyEventArgs e)
- textBox1_KeyPress(object sender, KeyPressEventArgs e)
- textBox1_KeyUp(object sender, KeyEventArgs e)
从时间函数传入的事件参数可以看出,KeyDown和KeyUp用的是KeyEventArgs,KeyPress 用的是KeyPressEventArgs。
查阅MSDN,KeyEventArgs 提供了KeyCode,KeyData等System.Windows.Forms.Keys里定义的枚举。如下:
- using System;
- using System.ComponentModel;
- using System.Drawing.Design;
- using System.Runtime.InteropServices;
- namespace System.Windows.Forms
- {
- // 概要:
- // Specifies key codes and modifiers.
- [Flags]
- [ComVisible(true)]
- [TypeConverter(typeof(KeysConverter))]
- [Editor("System.Windows.Forms.Design.ShortcutKeysEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
- public enum Keys
- {
- // 概要:
- // The bitmask to extract modifiers from a key value.
- Modifiers = -65536,
- //
- // 概要:
- // No key pressed.
- None = 0,
- //
- // 概要:
- // The left mouse button.
- LButton = 1,
- //
- // 概要:
- // The right mouse button.
- RButton = 2,
- //
- // 概要:
- // The CANCEL key.
- Cancel = 3,
- //
- // 概要:
- // The middle mouse button (three-button mouse).
- MButton = 4,
- //
- // 概要:
- // The first x mouse button (five-button mouse).
- XButton1 = 5,
- //
- // 概要:
- // The second x mouse button (five-button mouse).
- XButton2 = 6,
- //
- // 概要:
- // The BACKSPACE key.
- Back = 8,
- //
- // 概要:
- // The TAB key.
- Tab = 9,
- //
- // 概要:
- // The LINEFEED key.
- LineFeed = 10,
- //
- // 概要:
- // The CAPS LOCK key.
- Capital = 20,
- //内容太多了,略去。。。。。。
- // 概要:
- // The ALT modifier key.
- Alt = 262144,
- }
- }
KeyPressEventArgs里自只定义了个KeyChar,并且是char型的。因此:
----要处理与按键相关的操作只能在KeyDown里处理,如是否按了Ctrl键或是同时按下了Ctrl+A键,诸如此类的按键判断都应该在KeyDown里处理。(KeyUp也能获得按键信息,不过是在按键上升是触发)
- private void textBox1_KeyDown(object sender, KeyEventArgs e)
- {
- //是否安了键盘的A键
- if (e.KeyCode == Keys.A)
- {
- }
- }
----要处理具体按下后的输出字符要用KeyPresss事件,比如验证是不是输入了数字,判断Ascii码即可。
- private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
- {
- if (e.KeyChar >= '0' && e.KeyChar <= '9')
- {
- }
- }
在KeyDown里可以判断是不是按了数字键来判断,但是要同时判断键盘上的数字和小键盘的数字,不太可取。
- private void textBox1_KeyDown(object sender, KeyEventArgs e)
- {
- if((e.KeyCode >= Keys.D0 && e.KeyCode <=Keys.D9) ||
- (e.KeyCode>= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))
- {
- }
- }
3)取消用户输入应该用什么方法?
不要用户输入数字以外的字符,已经输入的字符如何取消呢?答案是可以在KeyPress里取消,也可以在KeyDown里取消。
1, KeyPress里取消输入 (A不能输入)
- private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
- {
- if (e.KeyChar == 'A')
- {
- e.Handled = true;
- }
- }
2,KeyDown里取消输入 (A不能输入)
- private void textBox1_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.KeyCode == Keys.A)
- {
- e.SuppressKeyPress();
- }
- }
SuppressKeyPress方法可以取消KeyPress事件,注意此时KeyUp事件也被取消了(实验得知)。
4)关于KeyDown和KeyUp
KeyDown触发几次KeyUp就触发几次。
1,按键盘的A键,KeyDwon和KeyUp各触发一次。
KeyDown里的KeyEventArgs的值如下:(注意:KeyCode,Keydata,KeyValue里的值是伪代码,不一定和程序吻合,只是为了说明问题)
KeyCode:Keys.A
KeyData:Keys.A
KeyValue:65
KeyUp里的KeyEventArgs的值和KeyDown相同。
2,按键盘的Ctrl+A,KeyDwon和KeyUp个触发两次。
第一次KeyDown里的KeyEventArgs的值如下:
KeyCode:Keys.ContrlKey
KeyData:Keys.ContrlKey
KeyValue:17
第二次KeyDown里的KeyEventArgs的值如下:
KeyCode:Keys.A
KeyData:Keys.ContrlKey + Keys.A
KeyValue:65
第一次KeyUp里的KeyEventArgs的值如下:
KeyCode:Keys.A
KeyData:Keys.ContrlKey + Keys.A
KeyValue:65
第二次KeyUp里的KeyEventArgs的值如下:
KeyCode:Keys.ContrlKey
KeyData:Keys.ContrlKey
KeyValue:17
可以看出,KeyUp的顺序和KeyDown顺序是相反的,类似于栈,先进后出。
5) 某些特殊键在控件上被默认处理的解决办法
比如,TextBox上的TAB键就被默认处理的,在TextBox上按Tab键,将不会触发KeyDown已经后面的KeyPress和KeyUp事件,解决的办法是重新TextBox控件的IsInputKey方法,这个在MSDN上有说明,特实践证明了下,确实可行。
- class TextBoxEx :System.Windows.Forms.TextBox
- {
- protected override bool IsInputKey(System.Windows.Forms.Keys keyData)
- {
- if (keyData == System.Windows.Forms.Keys.Tab)
- {
- return true;
- }
- return base.IsInputKey(keyData);
- }
- }
换用以上的TextBoxEx后,按下Tab键,就能触发KeyDown,KeyPress,KeyUp等事件了。
以上纯属个人无事消遣,各位看官笑过就好。
Winform下KeyDown,KeyPress,KeyUp事件的总结(转)的更多相关文章
- keyDown keyPress keyUp 事件的区别
keyDown keyPress keyUp 事件的区别 一 触发顺序 显而易见,事件发生的顺序是: keydown --> keypress --> keyup 当按住一个键一段时间后 ...
- keydown,keypress,keyup三者之间的区别
最近看了Javascript高级教程中对过滤输入的介绍,想实现比如电话号码中不能包好非数值的字符,而相应文本中插入字符的操作是keypress事件,所以就想通过阻止这个事件的默认事件行为来阻止这个事件 ...
- keydown - > keypress - > keyup 用法和区别
英文输入法: 事件触发顺序:keydown - > keypress - > keyup 中文输入法: firfox:输入触发keydown,回车确认输入触发keyup chr ...
- keydown - > keypress - > keyup
英文输入法: 事件触发顺序:keydown - > keypress - > keyup 中文输入法: firfox:输入触发keydown,回车确认输入触发keyup chr ...
- 键盘事件之keydown keypress keyup区别
经过测试,显然事件执行的顺序是: keydown->keypress->keyup. 但是连续按一个按键的话,会一直触发:keydown keypress.直到你提起按键,会触发keyup ...
- 部分无线终端不响应键盘事件(keydown,keypress,keyup)的解决办法
在无线侧实现搜索显示smartbox功能的时候,会对输入框绑定keydown.keyup.keypress事件,从而在检测到输入框的值发生改变时,发出请求拉取smartbox的内容. 但是,在iPho ...
- 无线端不响应键盘事件(keydown,keypress,keyup)
今天在项目时,在android手机上使用输入法的智能推荐的词的话,不会触发keyup事件,一开始想到在focus时使用一个定时器,每隔100ms检测输入框的值是否发生了改变,如果改变了就作对应的处理, ...
- 【转】Winform下KeyDown,KeyPress,KeyUp事件的总结
http://blog.csdn.net/xiashengwang/article/details/6777907
- <span> <div> 局部 keydown ,keyup事件。页面部分div $(document) 无效,可能焦点,添加焦点。
前天改一个bug, js 实现的一个 面板拖拉,左右各两个列表,中间面板画线连接,页面左侧列表选中后,key 事件无效.右侧选中确有效,很奇怪,查看源码,左侧选中后,$(document).on(&q ...
随机推荐
- hdu 4370
这个题说实话我没看出来,我看的别人的博客 https://blog.csdn.net/u013761036/article/details/39377499 这个人讲的很清楚,可以直接去看他的 题目给 ...
- 【腾讯Bugly干货分享】舞动的表情包——浅析GIF格式图片的存储和压缩
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/v0pffOhjFWnVbU2lXjuEmw 导语 G ...
- 算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结.数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下.当然数据结构相关博客中我们以Swift语言来实现.因为Swift ...
- 简单 v.s. 基础
无论做平面设计还是做摄影创作,其基础都是一些比较粗浅的看似毫无用处的简单技能.例如画直线.拍挂在墙上的电视机,不一而足. 同样的现象还能在web的前端设计中看到.一堆类似小孩学绘画的标签,几个可以更改 ...
- JavaScript中常见的10个BUG及其修复方法
如今网站几乎100%使用JavaScript.JavaScript看上去是一门十分简单的语言,然而事实并不如此.它有很多容易被弄错的细节,一不注意就导致BUG. 1. 错误的对this进行引用 在闭包 ...
- 致我们再也回不去的 Github ...
本文原文来自公众号 stormzhang,原作者自称“二流学校毕业.非科班出身.从 0 自学编程到现在的「段子张」”. 1.前言 相信大家都知道了,微软已确认要收购 GitHub 了,Github ...
- ScrollView嵌套子View的getDrawingCache为空的解决方法
ScrollView嵌套子View的getDrawingCache为空的解决方法 问题 将组件的显示布局改为可以滚动的,然后用ScrollView作为了View的父类,发现View的getDrawin ...
- JVM内存分配和垃圾收集策略
java内存区域 程序计数器 因为java可以多线程并发执行,因此,为了线程切换后能恢复到正确的执行位置,每个线程都需要一个独立的程序计数器.记录正在执行的虚拟机字节码指令的地址. 这个区域不会产生内 ...
- itext实现pdf自动定位合同签订
需求 需要实现如下效果(最终效果) 思考 需求方的要求就是实现签订合同,实现方法不限,但过程中又提出需要在签章的过程中把签订日期的文字也打上去,这就有点坑了~ 一开始的想法是想办法定位需要签名的位置, ...
- 记录python题
def mone_sorted(itera): new_itera = [] while itera: min_value = min(itera) new_itera.append(min_valu ...