zoukankan      html  css  js  c++  java
  • Winform下KeyDown,KeyPress,KeyUp事件的总结

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

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

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

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

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

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

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

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

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

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


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


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


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

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

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


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

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


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


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


  • 相关阅读:
    MySQL三种备份
    四层和七层负载均衡的区别
    触发器及触发器的作用
    sql 存储过程
    自动ftp 上传
    #题目:有10 台被监控主机、一台监控机,在监控机上编写脚本,一旦某台被监控机器/ 分区适用率大于80%, 就发邮件报警放到crontab 里面, 每10 分钟检查一次
    /proc/sys 子目录的作用
    Linking code for an enhanced application binary interface (ABI) with decode time instruction optimization
    facebook webdriver 学习
    WebDriverException: Message: A session is either terminated or not started
  • 原文地址:https://www.cnblogs.com/xiashengwang/p/2578798.html
Copyright © 2011-2022 走看看