原文: http://www.cnblogs.com/xiashengwang/archive/2011/09/15/2578798.html

在winform程序中,经常会用到这几个事件用于控制数字输入,按键动作等操作,但一直没有完全弄清楚他们之间的区别和联系,到底什么时候用哪一个事件合适,闲暇无事,做了一个小小的总结,以免以后犯糊涂。

1) 这三个事件调用的先后顺序(MSDN)

     1. KeyDown    :在控件有焦点的情况下按下键时发生

2. KeyPress   :在控件有焦点的情况下按下键时发生。

3. KeyUp         :在控件有焦点的情况下释放键时发生。

2) KeyDown和KeyPress在MSDN上的解释完全一样,都是在按下键的时候发生,那区别是什么呢?

  1. textBox1_KeyDown(object sender, KeyEventArgs e)
  2. textBox1_KeyPress(object sender, KeyPressEventArgs e)
  3. textBox1_KeyUp(object sender, KeyEventArgs e)

从时间函数传入的事件参数可以看出,KeyDown和KeyUp用的是KeyEventArgs,KeyPress 用的是KeyPressEventArgs。

查阅MSDN,KeyEventArgs 提供了KeyCode,KeyData等System.Windows.Forms.Keys里定义的枚举。如下:

  1. using System;
  2. using System.ComponentModel;
  3. using System.Drawing.Design;
  4. using System.Runtime.InteropServices;
  5. namespace System.Windows.Forms
  6. {
  7. // 概要:
  8. //     Specifies key codes and modifiers.
  9. [Flags]
  10. [ComVisible(true)]
  11. [TypeConverter(typeof(KeysConverter))]
  12. [Editor("System.Windows.Forms.Design.ShortcutKeysEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
  13. public enum Keys
  14. {
  15. // 概要:
  16. //     The bitmask to extract modifiers from a key value.
  17. Modifiers = -65536,
  18. //
  19. // 概要:
  20. //     No key pressed.
  21. None = 0,
  22. //
  23. // 概要:
  24. //     The left mouse button.
  25. LButton = 1,
  26. //
  27. // 概要:
  28. //     The right mouse button.
  29. RButton = 2,
  30. //
  31. // 概要:
  32. //     The CANCEL key.
  33. Cancel = 3,
  34. //
  35. // 概要:
  36. //     The middle mouse button (three-button mouse).
  37. MButton = 4,
  38. //
  39. // 概要:
  40. //     The first x mouse button (five-button mouse).
  41. XButton1 = 5,
  42. //
  43. // 概要:
  44. //     The second x mouse button (five-button mouse).
  45. XButton2 = 6,
  46. //
  47. // 概要:
  48. //     The BACKSPACE key.
  49. Back = 8,
  50. //
  51. // 概要:
  52. //     The TAB key.
  53. Tab = 9,
  54. //
  55. // 概要:
  56. //     The LINEFEED key.
  57. LineFeed = 10,
  58. //
  59. // 概要:
  60. //     The CAPS LOCK key.
  61. Capital = 20,
  62. //内容太多了,略去。。。。。。
  63. // 概要:
  64. //     The ALT modifier key.
  65. Alt = 262144,
  66. }
  67. }

KeyPressEventArgs里自只定义了个KeyChar,并且是char型的。因此:

----要处理与按键相关的操作只能在KeyDown里处理,如是否按了Ctrl键或是同时按下了Ctrl+A键,诸如此类的按键判断都应该在KeyDown里处理。(KeyUp也能获得按键信息,不过是在按键上升是触发)

  1. private void textBox1_KeyDown(object sender, KeyEventArgs e)
  2. {
  3. //是否安了键盘的A键
  4. if (e.KeyCode == Keys.A)
  5. {
  6. }
  7. }

----要处理具体按下后的输出字符要用KeyPresss事件,比如验证是不是输入了数字,判断Ascii码即可。

  1. private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
  2. {
  3. if (e.KeyChar >= '0' && e.KeyChar <= '9')
  4. {
  5. }
  6. }

在KeyDown里可以判断是不是按了数字键来判断,但是要同时判断键盘上的数字和小键盘的数字,不太可取。

  1. private void textBox1_KeyDown(object sender, KeyEventArgs e)
  2. {
  3. if((e.KeyCode >= Keys.D0 && e.KeyCode <=Keys.D9) ||
  4. (e.KeyCode>= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9))
  5. {
  6. }
  7. }

3)取消用户输入应该用什么方法?

不要用户输入数字以外的字符,已经输入的字符如何取消呢?答案是可以在KeyPress里取消,也可以在KeyDown里取消。

1, KeyPress里取消输入 (A不能输入)

  1. private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
  2. {
  3. if (e.KeyChar == 'A')
  4. {
  5. e.Handled = true;
  6. }
  7. }

2,KeyDown里取消输入 (A不能输入)

  1. private void textBox1_KeyDown(object sender, KeyEventArgs e)
  2. {
  3. if (e.KeyCode == Keys.A)
  4. {
  5. e.SuppressKeyPress();
  6. }
  7. }

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上有说明,特实践证明了下,确实可行。

  1. class TextBoxEx :System.Windows.Forms.TextBox
  2. {
  3. protected override bool IsInputKey(System.Windows.Forms.Keys keyData)
  4. {
  5. if (keyData == System.Windows.Forms.Keys.Tab)
  6. {
  7. return true;
  8. }
  9. return base.IsInputKey(keyData);
  10. }
  11. }

换用以上的TextBoxEx后,按下Tab键,就能触发KeyDown,KeyPress,KeyUp等事件了。

以上纯属个人无事消遣,各位看官笑过就好。

Winform下KeyDown,KeyPress,KeyUp事件的总结(转)的更多相关文章

  1. keyDown keyPress keyUp 事件的区别

    keyDown keyPress keyUp  事件的区别 一 触发顺序 显而易见,事件发生的顺序是: keydown --> keypress --> keyup 当按住一个键一段时间后 ...

  2. keydown,keypress,keyup三者之间的区别

    最近看了Javascript高级教程中对过滤输入的介绍,想实现比如电话号码中不能包好非数值的字符,而相应文本中插入字符的操作是keypress事件,所以就想通过阻止这个事件的默认事件行为来阻止这个事件 ...

  3. keydown - > keypress - > keyup 用法和区别

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

  4. keydown - > keypress - > keyup

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

  5. 键盘事件之keydown keypress keyup区别

    经过测试,显然事件执行的顺序是: keydown->keypress->keyup. 但是连续按一个按键的话,会一直触发:keydown keypress.直到你提起按键,会触发keyup ...

  6. 部分无线终端不响应键盘事件(keydown,keypress,keyup)的解决办法

    在无线侧实现搜索显示smartbox功能的时候,会对输入框绑定keydown.keyup.keypress事件,从而在检测到输入框的值发生改变时,发出请求拉取smartbox的内容. 但是,在iPho ...

  7. 无线端不响应键盘事件(keydown,keypress,keyup)

    今天在项目时,在android手机上使用输入法的智能推荐的词的话,不会触发keyup事件,一开始想到在focus时使用一个定时器,每隔100ms检测输入框的值是否发生了改变,如果改变了就作对应的处理, ...

  8. 【转】Winform下KeyDown,KeyPress,KeyUp事件的总结

    http://blog.csdn.net/xiashengwang/article/details/6777907

  9. <span> <div> 局部 keydown ,keyup事件。页面部分div $(document) 无效,可能焦点,添加焦点。

    前天改一个bug, js 实现的一个 面板拖拉,左右各两个列表,中间面板画线连接,页面左侧列表选中后,key 事件无效.右侧选中确有效,很奇怪,查看源码,左侧选中后,$(document).on(&q ...

随机推荐

  1. Postman SMTP 存在跨站脚本(XSS)漏洞,请换用Post SMTP Mailer/Email Log

    Postman SMTP 是一个安装量超过10W的WordPress插件,但是已经2年多没有更新,2017年6月29日,被发现存在跨站脚本(XSS)漏洞(查看详情),并且作者一直没有更新,所以被从Wo ...

  2. Postgresql 数据库错误修复v0.1

    PS. 查询\nebula_boh\logs\BOHInterfaceLog.log 日志, 一般数据库文件损坏的日志 有 “UncategorizedSQLException” 或 “zero pa ...

  3. Promise实践

    一.概念 Promise是异步编程的解决方案之一,与事件驱动+回调函数并列. Promise是专门为异步编程设计的封闭的一次性用品,封闭体现在只有异步操作的结果能改变其状态,其他任何操作都不能改变其状 ...

  4. Firewalld的结构

    原文地址:http://www.excelib.com/article/287/show firewalld简介 Centos7中默认将原来的防火墙iptables升级为了firewalld,fire ...

  5. 工具安装(mac)

    1. iterm 2. nvm 3. node 4. git 5. VScode 6. postman 1.安装iterm2安装路径 https://www.iterm2.com/使用技巧https: ...

  6. Android开发 - 掌握ConstraintLayout(八)障碍线(Barrier)

    本文我们来介绍障碍线(Barrier)的使用,平常在开发中用的相对要少一些,但是在需要时会非常方便. 它的作用是将多个元素放到这个障碍线里面使时,其中的任何元素的大小或位置变化时都会使它的位置进行改变 ...

  7. 逆水行舟 —— MyBatis

    第一轮总结性笔记 这是一个很漫长的过程,我买了套课程,将在日后记录学习笔记,取名为逆水行舟系列 MyBatis的基础 根据MyBatis的官方介绍: 整个测试项目结构如下:使用Maven架构项目 po ...

  8. 刺透内网的HTTP代理

    从偶然出发 在做测试的时候发现了这样一个漏洞,原请求报文如下: GET / HTTP/1.1 Host: attack_website [... HEADER ...] ... 当时最初目的是想测SS ...

  9. ISG 2018 Web Writeup

    作者:agetflag 原文来自:ISG 2018 Web Writeup ISG 2018 Web Writeup CTF萌新,所以写的比较基础,请大佬们勿喷,比赛本身的Web题也不难 calc 首 ...

  10. win10怎么查看激活到期时间如何看是否永久激活

    win10怎么查看激活到期时间如何看是否永久激活     我们知道Windows系统需要激活后才可以使用全部功能,那么你的Windows10激活了吗?如何查看激活时间呢?是不是永久激活的?带着这些问题 ...