(转)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区别的更多相关文章
- C#中KeyDown和KeyPress区别
1.比如说TexBox 输入'a' 按下->触发KeyDown事件,然后去处理 ->将a显示输入到文本框后 ->触发KeyPress事件
- 详解键盘事件(keydown,keypress,keyup)
一.键盘事件基础 1.定义 keydown:按下键盘键 keypress:紧接着keydown事件触发(只有按下字符键时触发) keyup:释放键盘键 顺序为:keydown -> keypre ...
- KeyUp 和KeyDown 、KeyPress之间的区别
keydown:用户在键盘上按下某按键是发生.一直按着某按键则会不断触发(opera浏览器除外). keypress:用户按下一个按键,并产生一个字符时发生(也就是类似shift.alt.ctrl之类 ...
- 【转】keypress keydown keyup 区别
KeyPress主要用来接收字母.数字等ANSI字符,而 KeyDown 和 KeyUP 事件过程可以处理任何不被 KeyPress 识别的击键,诸如:功能键(F1-F12).编辑键.定位键以及任何这 ...
- C# 中 KeyPress 、KeyDown 和KeyPress的详细区别[转]
研究了一下KeyDown,KeyPress 和KeyUp ,发现之间还是有点学问的. 让我们带着如下问题来说明,如果你看到这些问题你都知道,那么这篇文章你就当复习吧:) 1.这三个事件的顺序是怎么样的 ...
- 键盘事件keydown、keypress、keyup随笔整理总结(摘抄)
原文1:http://www.cnblogs.com/silence516/archive/2013/01/25/2876611.html 原文2:http://www.cnblogs.com/leo ...
- Winform下KeyDown,KeyPress,KeyUp事件的总结(转)
原文: http://www.cnblogs.com/xiashengwang/archive/2011/09/15/2578798.html 在winform程序中,经常会用到这几个事件用于控制数字 ...
- C#控件中的KeyDown、KeyPress 与 KeyUp事件浅谈
研究了一下KeyDown,KeyPress 和 KeyUp 的学问.让我们带着如下问题来说明: 1.这三个事件的顺序是怎么样的? 2.KeyDown 触发后,KeyUp是不是一定触发? 3.三个事件的 ...
- 键盘事件keydown、keypress、keyup随笔整理总结
英文输入法: 事件触发顺序:keydown - > keypress - > keyup 中文输入法: firfox:输入触发keydown,回车确认输入触发keyup chr ...
随机推荐
- [Eclipse] eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件【待解决】
eclipse中打开xml文件,使用ctrl+鼠标左键无法跳转至Java源文件: 1. 设置eclipse ctrl + 左键打开源文件代码,如下图,设置都正常 2. 在网上找了很多种办法,均失败,在 ...
- zzy:java采用的是16位的Unicode字符集作为编码方式------理解
java语言使用16位的Unicode字符集作为编码方式,是疯狂Java中的原话. 1,编码方式只是针对字符类型的(不包括字符串类,数值类型int等,这些只是在解释[执行]的时候放到Jvm的不同内存块 ...
- WPF之MVVM(Step1)——自己实现ICommand接口
开发WPF应用程序,就不得不提MVVM.下面偶将展示MVVM中简单的实现,其中主要在于ICommand的实现上,不过这种实现方式,应该不会有多少人在开发中使用,在此仅作学习使用. 准备: 界面绘制,简 ...
- Build better apps: Windows 10 by 10 development series
http://blogs.windows.com/buildingapps/2015/08/05/build-better-apps-windows-10-by-10-development-seri ...
- I/O复用模型之epoll学习
简介: epoll是linux下多路复用I/O接口select/poll的增强版,它能够显著提高程序在大量并发连接中只有少量活跃的情况下的系统cpu利用率,原因是它会复用文件描述符集合来传递结果而不用 ...
- opengl纹理映射总结
大概步骤: 1.创建纹理对象,并为他指定一个纹理. 2.确定纹理如何应用到每个像素上. 3.启用纹理贴图 4.绘制场景,提供纹理和几何坐标 过滤:由于我们提供的纹理图像很少能和最终的屏幕坐标形成对应, ...
- Hadoop Mapreduce分区、分组、二次排序过程详解[转]
原文地址:Hadoop Mapreduce分区.分组.二次排序过程详解[转]作者: 徐海蛟 教学用途 1.MapReduce中数据流动 (1)最简单的过程: map - reduce (2) ...
- Js图片切换
<!DOCTYPE html><html<head> <meta charset="UTF-8"> <title></t ...
- hdu 5692 Snacks 线段树+dfs
Snacks Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 为什么下载APP,扫描二维码,关注微信公众号,就会送牛奶送小礼品?下载使用量高,会怎样?
以前的老办法是到处贴广告,电视上,广播上各种宣传. 在互联网时代,企业要盈利,除了不断优化升级自己的产品和服务,大量推广宣传产品,还要懂得用户思维.现在有网站,有APP,有微信,有二维码,可以卖产品, ...