KeyDown、KeyUp、KeyPress区别
Windows窗体通过引发键盘事件来处理键盘输入以响应Windows消息,大多数Windows窗体应用程序都通过处理键盘事件来以独占方式处理键盘输入。
1.按键的类型
Windows窗体将键盘输入标识为由按位Keys枚举表示的虚拟键代码。使用Keys枚举,可以综合一系列按键以生成单个值,这些值与WM_KEYDOWN和WM_SYSKEYDOWNWindows消息所伴随的值相对应。另外,程序开发人员可通过处理KeyDown或KeyUp 事件来检测大多数物理按键操作。字符键是Keys枚举的子集,它们与WM_CHAR和WM_SYSCHAR Windows消息所伴随的值相对应,如果通过组合按键得到一个字符,则可以通过处理KeyPress事件来检测该字符。
2.键盘事件的顺序
一个控件上可能出现3个与键盘相关的事件,下面是这些事件发生的常规顺序:
用户按“a”键,该键将被预处理和调度,而且会发生KeyDown事件。
用户按住“a”键,该键将被预处理和调度,而且会发生KeyPress事件。
用户松开“a”键,该键将被预处理和调度,而且会发生KeyUp事件。
3.键的预处理
像其他消息一样,键盘消息是在窗体或控件的WndProc方法中处理的。窗体或控件在处理键盘消息之前,PreProcessMessage方法会调用一个或多个方法,这些方法可被重写以处理特殊的字符键和物理按键。
/*********************/
键事件按下列顺序发生:
KeyDown
KeyPress
KeyUp
KeyDown触发后,不一定触发KeyUp,当KeyDown 按下后,拖动鼠标,那么将不会触发KeyUp事件。
定义
KeyDown:在控件有焦点的情况下按下键时发生。
KeyPress:在控件有焦点的情况下按下键时发生。(下面会说和KeyDown 的区别)
KeyUp:在控件有焦点的情况下释放键时发生。
KeyPress 和KeyDown 、KeyPress之间的区别
1、KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)、字母(注意:包括大小写)、小键盘等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、ScrollLock、Pause、NumLock、{菜单键}、{开始键}和方向键外的ANSI字符
2、KeyDown 和KeyUp 通常可以捕获键盘除了PrScrn所有按键(这里不讨论特殊键盘的特殊键)
3、KeyPress 只能捕获单个字符
4、KeyDown 和KeyUp 可以捕获组合键。
5、KeyPress 可以捕获单个字符的大小写
6、KeyDown和KeyUp 对于单个字符捕获的KeyValue 都是一个值,也就是不能判断单个字符的大小写。
7、KeyPress 不区分小键盘和主键盘的数字字符。
8、KeyDown 和KeyUp 区分小键盘和主键盘的数字字符。
9、其中PrScrn 按键KeyPress、KeyDown和KeyUp 都不能捕获。
/*******************/
其实我们按下一个键时,KeyDown和KeyPress是都要发生的,而且两个人看上去没有什么区别。但是其实两者还是有实质的区别的。
例如在一个多行文本框里面输入字符,为什么我们没有定义一个键盘响应事件,但是键盘却响应了,把字符输入到了文本框呢?其实我觉得因为这个事件就是系统默认的一个消息响应,它就是KeyPress。如果你自己还给KeyPress定义了自己的响应的话,那么程序会先执行你定义的程序,然后完成系统要求的显示字符事件的响应过程,但是如果你在自己定义KeyPress事件如:private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)里面增加语句:e.Handled=true;那么系统要求的显示字符响应过程就不会被执行,原因就是这个语句的意思就是这个消息响应已经完成。但是如果你在KeyDown,KeyUp里面加这条语句,显示字符串等消息还是会发生,这说明系统的显示字符串和KeyDown,KeyUp是没有关系的,而对于回车和退格消息响应则是由KeyDown控制,增加那条语句则回车换行不会执行,退格响应也不会执行。
综上:要屏蔽键盘上的一个字符的输入,可以在KeyPress里面进行增加语句,而要屏蔽回车和退格则可以在KeyDown里面进行增加语句。
From:http://www.cnblogs.com/poren/articles/1536724.html
--------------------------------------其它资料:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;
if ((msg.Msg == WM_KEYDOWN) ||(msg.Msg == WM_SYSKEYDOWN))
{
switch (keyData)
{
case Keys.Down:
this.Parent.Text = "向下键已经被捕捉";
break;
case Keys.Up:
this.Parent.Text = "向上键已经被捕捉";
break;
case Keys.Left:
this.Parent.Text = "向左键已经被捕捉";
break;
case Keys.Right:
this.Parent.Text = "向右键已经被捕捉";
break;
case Keys.Home:
this.Parent.Text = "Home 键已经被捕捉";
break;
case Keys.End:
this.Parent.Text = "End 键已经被捕捉";
break;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
补充:要使用e.handled=true 屏蔽输入,对普通键应放在KeyPress事件中,而控制键等应该在KeyDown中。
KeyDown、KeyUp、KeyPress区别相关推荐
- keypress,keydown,keyup的区别:
与 keydown 事件相关的事件顺序: keydown - 键按下的过程 keypress - 键被按下 keyup - 键被松开 当键盘键被按下时发生 keydown 事件 .keypress,k ...
- jQuery基础:keydown( ) 与 keypress( ) 区别
1.结论: 相同点:当按钮被按下时,会发生该事件,发生在当前获得焦点的元素上. 输入中文区别较大,试一试 <!DOCTYPE html> <html lang="en&qu ...
- html body keydown,HTML DOM--gt;键盘事件:keydown/keyup/keypress
1.定义和使用 keydown:某个键盘按键被按下 keyup:某个键盘按键被松开 keypress:个键盘按键被按下并松开 注意: 1. 键盘事件的属性不能用于以下元素: , , , , , , , ...
- HTML DOM-->键盘事件:keydown/keyup/keypress
1.定义和使用 keydown:某个键盘按键被按下 keyup:某个键盘按键被松开 keypress:个键盘按键被按下并松开 注意: 1. 键盘事件的属性不能用于以下元素: <base>, ...
- (转)KeyDown、KeyUp、KeyPress区别
Windows窗体通过引发键盘事件来处理键盘输入以响应Windows消息,大多数Windows窗体应用程序都通过处理键盘事件来以独占方式处理键盘输入. 1.按键的类型 Windows窗体将键盘输入标 ...
- C#控件中的KeyDown、KeyPress 与 KeyUp使用区别
定义 KeyDown:在控件有焦点的情况下按下键时发生. KeyPress:在控件有焦点的情况下按下键时发生.(下面会说和KeyDown 的区别) KeyUp:在控件有焦点的情况下释放键时发生. Ke ...
- java keydown_键盘事件keydown、keypress、keyup随笔整理总结
英文输入法: 事件触发顺序:keydown - > keypress - > keyup 中文输入法: firfox:输入触发keydown,回车确认输入触发keyup chrome:输入 ...
- python绑定按键pageup键_键盘事件keydown、keypress、keyup随笔整理总结(摘抄)
原文1:http://www.cnblogs.com/silence516/archive/2013/01/25/2876611.html 原文2:http://www.cnblogs.com/leo ...
- C# 中 KeyPress 、KeyDown 和KeyPress的详细区别[转]
事件按下列顺序发生: 1.KeyDown 2.KeyPress 3.KeyUp KeyDown触发后,一定触发KerUp吗 KeyDown触发后,不一定触发KeyUp,当KeyDown 按下后,拖动鼠 ...
最新文章
- ZAM 3D入门教程(5):Lathe编辑器
- windows下使用自带certutil工具校验文件MD5、SHA1、SHA256
- 强化学习笔记:Q_learning (Q-table)示例举例
- vue+springboot图片上传,addResourceHandlers调用无效
- Weak Pair (dfs+树状数组)
- 高清视频录播服务器网站,高清录播服务器——DDA RSS3000
- Apollo公开课四:感知
- [原创]通过动态Sql语句,一次性彻底删除或者修改SBO的某个字段对应内容的信息...
- matlab蚁群算法解决vrp过程,蚁群算法MATLAB解VRP问题
- Kitkat中对class core, class main, class late_start的简单分析
- 小程序下拉刷新没有三个小圆点的加载动画
- C语言规定 在一个源程序中 main函数,C语言规定:在一个源程序中,main函数的位置()A.必须在程序的最开始B.必须在系统调用的库函数的_搜题易...
- 报错:Error creating bean with name ‘serverEndpointExporter‘ defined in class path resource [group/oneo
- 【大数据入门核心技术-HBase】(八)Phoenix简介
- 在Winform(C++/CLR)平台设计的(本地在线)音乐播放器(基于WMP(Windows Media Player)控件实现)
- 2个字节秒解智能吓数1668加密狗
- 如何在零件层隐藏/显示SOLIDWORKS尺寸?
- Delving into Localization Errors for Monocular 3D Object Detection 论文学习
- 数说故事与华为云签署全面合作协议,共同升级数字世界营销新体验
- 知识图谱学习笔记02-经典的知识图谱项目介绍
热门文章
- npm -g, npm -s, npm -d 的区别
- set的三种遍历方式-----不能用for循环遍历(无序)
- Ubuntu 18.04更改用户名
- 2022 七校联合NewStarCTF 公开赛赛道 WEEK2|MISC
- 认知无线电网络架构与协议体系
- STM32使能IIC驱动电流检测芯片INA226
- Java基础类型的包装类传值NullPoint问题
- TDM-GCC MINGW配置与优化算法测试函数使用
- tf计算矩阵维度_tensorflow tf.matmul() (多维)矩阵相乘(多维矩阵乘法)
- ionic图片点击放大,双指缩放