OnKeyPress事件

OnKeyPress事件是在用户按下键盘上任何一个可打印的字符时发生,只有能接收键盘输入的组件才有OnKeyPress事件。我们常常利用OnKeyPress事件截取在编辑框和组合框组件中所输入的击键,还可以立即测试击键的有效性或在字符输入时对其进行一定的格式处理。

例如,在TEdit组件上捕获OnKeyPress事件,判断输入的是否是小写字母,如果是,将其转换为大写字母,代码如下:

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)

{

if (Key >= 'a' && Key <= 'z')

{

Key += 'A' - 'a';

}

}

将Key的值改变为0时可取消击键,这样一来对象便接收不到字符,我们可以利用这个特点来屏蔽某些字符。例如,有时候我们只允许用户输入数字,则加入如下代码:

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)

{

if (Key < '0' || Key > '9')

{

Key = 0;//取消刚才输入的字符

}

}

注意:OnKeyPress事件可以引用任何可打印的键盘字符,一个来自标准字母表的字符或少数几个特殊字符之一的字符与 CTRL 键的组合,以及 ENTER 或 BACKSPACE 键,但它并不能识别功能键(F1~F12),上下左右键,Shift键,Ctrl键以及Alt键等特殊控制键或者是组合键,要捕获这些键可以采用OnKeyDown和OnKeyUp事件。

OnKeyDown/OnKeyUp事件

当按下某个键不放时,产生OnKeyDown事件;释放按键时,则产生OnKeyUp事件。虽然 OnKeyDown 和OnKeyUp 事件可应用于大多数键,它们最经常地还是应用于扩展的字符键如功能键等,以弥补OnKeyPress事件的不足。

例如,TEdit组件的OnKeyDown/OnKeyUp事件过程框架如下:

void __fastcall TForm1::Edit1KeyDown(TObject *Sender, WORD &Key,

TShiftState Shift)

void __fastcall TForm1::Edit1KeyUp(TObject *Sender, WORD &Key,

TShiftState Shift)

其中参数Key返回键盘的虚拟键码。

注意:OnKeyDown和OnKeyUp事件中的Key是Word型的,表示用户按的是键盘上的哪个键,OnKeyPress中的Key是Char型,表示用户输入什么字符。

参数Shift提供事件发生时Shift,Ctrl和Alt键的状态。Shift,Ctrl和Alt键的Shift值分别为ssShift,ssCtrl和ssAlt。例如,判断Shift,Ctrl和Alt键是否被按下的代码如下:

void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,

TShiftState Shift)

{

String strInfo("您刚才按下了:\n复合键:");

if (Shift.Contains(ssShift))

strInfo += "Shift键";

if (Shift.Contains(ssCtrl))

strInfo += "Ctrl键";

if (Shift.Contains(ssAlt))

strInfo += "Alt键";

strInfo += "\nASCII码:";

strInfo += IntToStr(Key);

MessageBox(NULL, strInfo.c_str(), "信息提示", MB_OK);

}

注意:要让某个对象产生OnKeyDown事件,OnKeyUp事件或OnKeyPress事件,先要让该对象获得控制权(即具有焦点),一个窗体仅在它没有可视和有效的控件或 KeyPreview 属性被设置为 True 时才能接收该事件。若在该对象上按住某个键再放开它,便会触发上面三个事件。如果三个事件中均有操作,则其执行先后次序为:OnKeyDown事件先执行,OnKeyPress事件其次,OnKeyUp事件最后执行。

OnKeyDown和OnKeyUp事件的事件处理过程中包含了最近一次击键发生时,控制键Alt,Shift或者Ctrl是否按下的信息,而OnKeyPress事件只返回键的ASCII字符。

  假设用户按下了Shift+P键,那么这三种键盘事件产生的顺序如下所示:

  (1)按下Shift键时将产生OnKeyDown事件。

  (2)保持Shift键再按下P时将产生OnKeyDown事件。

  (3)由于按下了P键,所以产生了OnKeyPress事件。

(4)释放Shift键和P键,将产生OnKeyUp事件。

OnKeyPress 将每个字符的大、小写形式作为不同的键代码解释,即作为两种不同的字符。而 OnKeyDown 和OnKeyUp 用两个参数解释每个字符的大写形式和小写形式:参数Key返回键盘的虚拟键码,显示物理的键(将 A 和 a 作为同一个键返回),参数Shift指示Shift键的状态,从而返回 A 或 a 其中之一。

疑问:如何判断同时按下Shift,Ctrl和Alt键?

补充:虚拟键码

大多数虚拟键码的名称在WINUSER.H表头档案中都定义为以VK_开头。下表列出了这些名称和数值(十进制和十六进制),以及与虚拟键相对应的IBM相容机种键盘上的键。

前四个虚拟键码中有三个指的是滑鼠键,您永远都不会从键盘讯息中获得这些滑鼠键代码,但我们能够从滑鼠讯息中获得它们。VK_CANCEL代码是一个虚拟键码,它包括同时按下两个键(Ctrl-Break)。Windows应用程式通常不使用此键。

Windows也包括在主键盘上的字母和数字键的虚拟键码,A 键到 Z 键与其 ASCII 码的相应值'A' 到 'Z' 是一致的,0键到9 键与其 ASCII 码的相应值 '0' 到 '9' 是一致的。

96~111代表数字小键盘上的键。

虽然多数的键盘都有12个功能键,但Windows只需要10个,而位元旗标却有24个。

十进位 十六进位   虚拟键码  IBM相容键盘

1      01     VK_LBUTTON   滑鼠左键

2      02     VK_RBUTTON   滑鼠右键

3      03     VK_CANCEL     Ctrl-Break

4      04     VK_MBUTTON   滑鼠中键

8      08     VK_BACK       Backspace

9      09     VK_TAB        Tab

12     0C     VK_CLEAR      CLEAR 键,Num Lock关闭时的数字键盘5

13     0D     VK_RETURN     Enter

16     10     VK_SHIFT      Shift

17     11     VK_CONTROL    Ctrl

18     12     VK_MENU       Alt

19     13     VK_PAUSE      Pause

20     14     VK_CAPITAL    Caps Lock

27     1B     VK_ESCAPE     Esc

32     20     VK_SPACE      Spacebar

33     21     VK_PRIOR      Page Up

34     22     VK_NEXT       Page Down

35     23     VK_END        End

36     24     VK_HOME       Home

37     25     VK_LEFT       左箭头

38     26     VK_UP         上箭头

39     27     VK_RIGHT      右箭头

40     28     VK_DOWN       下箭头

41     29     VK_SELECT     SELECT 键

42     2A     VK_PRINT     PRINT SCREEN 键

43     2B     VK_EXECUTE    EXECUTE 键

44     2C     VK_SNAPSHOT   SNAP SHOT 键

45     2D     VK_INSERT     Insert键

46     2E     VK_DELETE     Delete键

47     2F     VK_HELP       HELP 键

48-57  30-39 无            主键盘上的0到9

65-90  41-5A 无            A到Z

91     5B     VK_LWIN       左Windows键

92     5C     VK_RWIN       右Windows键

93     5D     VK_APPS       Applications键

96-105 60-69  VK_NUMPAD0到VK_NUMPAD9  NumLock打开时数字键盘上的0到9

106    6A     VK_MULTIPLY   数字键盘上的*

107    6B     VK_ADD        数字键盘上的+

108    6C     VK_SEPARATOR  数字键盘上的ENTER 键

109    6D     VK_SUBTRACT   数字键盘上的-

110    6E     VK_DECIMAL   数字键盘上的.

111    6F     VK_DIVIDE     数字键盘上的/

112-121    70-79      VK_F1到VK_F10    功能键F1到F10

122-135    7A-87      VK_F11到VK_F24  功能键F11到F24

144    90     VK_NUMLOCK   Num Lock

145    91     VK_SCROLL     Scroll Lock

浅析OnKeyPress事件和OnKeyDown、OnKeyUp事件相关推荐

  1. javascript之键盘事件onkeydown,onkeyup,onkeypress

    键盘事件 键盘事件一般绑定给document,以及一些可以获取焦点的标签,如input标签. onkeydown事件: 当键盘任意键按下时执行,按下不松,会不断执行. onkeyup事件: 当键盘任意 ...

  2. JS键盘监听事件:onkeydown、onkeypress、onkeyup

    1.都是监听键盘的行为,但是触发的时机不一样 onkeydown: 按下任意按键的时候触发的,onkeydown 触发的时候输入流正要进入系统,也就是说onkeydown事件一完,输入流就进入了系统, ...

  3. 仿hotmail收件人弹层: onkeyup事件无法捕获到回车按键, 用onkeydown事件捕获额外处理回车键...

    查了半天资料, 据说这三事件的执行顺序是: onkeydown  ->  onkeypress  ->  onkeyup =========================== 我遇到的情 ...

  4. onkeydown,onkeyup,onkeypress,onclick,ondblclick

    onkeydown,onkeyup,onkeypress,onclick,ondblclick 昨天群里面的朋友问了个比较有意思的问题,keydown,keyup,keypress事件的先后顺序. 这 ...

  5. 中文输入法不触发onkeyup事件的解决办法

    2019独角兽企业重金招聘Python工程师标准>>> 这两天做一个需要实时监控文本框输入的功能,碰到了中文输入法无法触发onkeyup事件的恶心问题. 具体表现是这样的: 当监听一 ...

  6. HTML5新增的表单事件:oninput、onkeyup、oninvalid

    HTML5新增的表单事件:oninput.onkeyup.oninvali 1:oninput 监听当前指定元素内容的改变:只要内容改变(添加元素,删除元素),就会触发这个事件 2:onkeyup 键 ...

  7. onkeyup事件,onpaste事件,完成实时表单验证

    先上效果图: input框,用户输入值的方式就两种,一种是键盘输入,一种是鼠标粘贴.onkeyup事件可以在键盘输入的时候绑定事件,onpaste="return false",设 ...

  8. android全局监听onkeydown,Android中的几个onTouch()事件、onKeyDown监听返回键无效

    Android中的几个onTouch()事件.onKeyDown监听返回键无效 一:Android中的几个onTouch()事件 继承SimpleOnGestureListener,HahaGestu ...

  9. 事件绑定、事件监听、事件委托

    2019独角兽企业重金招聘Python工程师标准>>> 在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代理)等 ...

最新文章

  1. java版mc植物生长条件_植物生长需要的五个条件
  2. 查看mysql,apache,php,nginx编译参数
  3. 事件溯源|日志记录-一个基础的微服务模式
  4. Python带*参数和带**参数
  5. 他曾一举击败英伟达,却因坚持研发背负骂名
  6. Docker国内Yum源和国内镜像仓库
  7. 虚拟机克隆MAC地址变更后的网络配置
  8. coreldraw x4如何出血_CorelDRAW软件出血位详解
  9. 海思EC6108V9盒子DIY固件打包方法
  10. 网页占满整个屏幕_网页打开后占满了全部电脑屏幕怎么办
  11. 推挽电路整理-三极管推挽电路
  12. Freyja2版本对分库分表的处理方式
  13. AD7705模数芯片原理详解
  14. 人这一辈子,都在为选择买单
  15. 【路由协议】和【应用协议】
  16. Java面试题!深度解析跳槽从开始到结束完整流程,吊打面试官
  17. python数据分析实战之超市零售分析
  18. 思科交换机配置ipv6实验
  19. 当网站不允许上传asp cer cdx htr文件时的一个解决方法!
  20. 求职偶摘1,据说是高盛offer。

热门文章

  1. 3D打印模型优势体现在哪些方面呢?
  2. 企业网站为何喜欢选择织梦系统?织梦cms的好处有哪些?
  3. 项目管理专业人员能力评价等级证书(CSPM)的级别介绍
  4. 有源rc电压放大器实验报告_常见的有源器件和无源器件
  5. Linux基础篇学习—shell及shell脚本
  6. Failed to find configured root that contains 安装apk报错
  7. 三种增加DataFrame行的办法
  8. 共享单车简史:曙光在何方
  9. 我是一名铺砖匠——铺砖问题汇总(DP)
  10. 智商测试儿童软件,儿童智商测试软件