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区别相关推荐

  1. keypress,keydown,keyup的区别:

    与 keydown 事件相关的事件顺序: keydown - 键按下的过程 keypress - 键被按下 keyup - 键被松开 当键盘键被按下时发生 keydown 事件 .keypress,k ...

  2. jQuery基础:keydown( ) 与 keypress( ) 区别

    1.结论: 相同点:当按钮被按下时,会发生该事件,发生在当前获得焦点的元素上. 输入中文区别较大,试一试 <!DOCTYPE html> <html lang="en&qu ...

  3. html body keydown,HTML DOM--gt;键盘事件:keydown/keyup/keypress

    1.定义和使用 keydown:某个键盘按键被按下 keyup:某个键盘按键被松开 keypress:个键盘按键被按下并松开 注意: 1. 键盘事件的属性不能用于以下元素: , , , , , , , ...

  4. HTML DOM-->键盘事件:keydown/keyup/keypress

    1.定义和使用 keydown:某个键盘按键被按下 keyup:某个键盘按键被松开 keypress:个键盘按键被按下并松开 注意: 1. 键盘事件的属性不能用于以下元素: <base>, ...

  5. (转)KeyDown、KeyUp、KeyPress区别

    Windows窗体通过引发键盘事件来处理键盘输入以响应Windows消息,大多数Windows窗体应用程序都通过处理键盘事件来以独占方式处理键盘输入. 1.按键的类型 Windows窗体将键盘输入标 ...

  6. C#控件中的KeyDown、KeyPress 与 KeyUp使用区别

    定义 KeyDown:在控件有焦点的情况下按下键时发生. KeyPress:在控件有焦点的情况下按下键时发生.(下面会说和KeyDown 的区别) KeyUp:在控件有焦点的情况下释放键时发生. Ke ...

  7. java keydown_键盘事件keydown、keypress、keyup随笔整理总结

    英文输入法: 事件触发顺序:keydown - > keypress - > keyup 中文输入法: firfox:输入触发keydown,回车确认输入触发keyup chrome:输入 ...

  8. python绑定按键pageup键_键盘事件keydown、keypress、keyup随笔整理总结(摘抄)

    原文1:http://www.cnblogs.com/silence516/archive/2013/01/25/2876611.html 原文2:http://www.cnblogs.com/leo ...

  9. C# 中 KeyPress 、KeyDown 和KeyPress的详细区别[转]

    事件按下列顺序发生: 1.KeyDown 2.KeyPress 3.KeyUp KeyDown触发后,一定触发KerUp吗 KeyDown触发后,不一定触发KeyUp,当KeyDown 按下后,拖动鼠 ...

最新文章

  1. ZAM 3D入门教程(5):Lathe编辑器
  2. windows下使用自带certutil工具校验文件MD5、SHA1、SHA256
  3. 强化学习笔记:Q_learning (Q-table)示例举例
  4. vue+springboot图片上传,addResourceHandlers调用无效
  5. Weak Pair (dfs+树状数组)
  6. 高清视频录播服务器网站,高清录播服务器——DDA RSS3000
  7. Apollo公开课四:感知
  8. [原创]通过动态Sql语句,一次性彻底删除或者修改SBO的某个字段对应内容的信息...
  9. matlab蚁群算法解决vrp过程,蚁群算法MATLAB解VRP问题
  10. Kitkat中对class core, class main, class late_start的简单分析
  11. 小程序下拉刷新没有三个小圆点的加载动画
  12. C语言规定 在一个源程序中 main函数,C语言规定:在一个源程序中,main函数的位置()A.必须在程序的最开始B.必须在系统调用的库函数的_搜题易...
  13. 报错:Error creating bean with name ‘serverEndpointExporter‘ defined in class path resource [group/oneo
  14. 【大数据入门核心技术-HBase】(八)Phoenix简介
  15. 在Winform(C++/CLR)平台设计的(本地在线)音乐播放器(基于WMP(Windows Media Player)控件实现)
  16. 2个字节秒解智能吓数1668加密狗
  17. 如何在零件层隐藏/显示SOLIDWORKS尺寸?
  18. Delving into Localization Errors for Monocular 3D Object Detection 论文学习
  19. 数说故事与华为云签署全面合作协议,共同升级数字世界营销新体验
  20. 知识图谱学习笔记02-经典的知识图谱项目介绍

热门文章

  1. npm -g, npm -s, npm -d 的区别
  2. set的三种遍历方式-----不能用for循环遍历(无序)
  3. Ubuntu 18.04更改用户名
  4. 2022 七校联合NewStarCTF 公开赛赛道 WEEK2|MISC
  5. 认知无线电网络架构与协议体系
  6. STM32使能IIC驱动电流检测芯片INA226
  7. Java基础类型的包装类传值NullPoint问题
  8. TDM-GCC MINGW配置与优化算法测试函数使用
  9. tf计算矩阵维度_tensorflow tf.matmul() (多维)矩阵相乘(多维矩阵乘法)
  10. ionic图片点击放大,双指缩放