Delphi中的OnKeyDown事件等等

键盘扫描码处理 

在键盘按键被押下时,第一个会产生的是所谓的扫描码(Scan Code),也就是硬体直接传回的按键代码,然后作业系统会把它转换为虚拟码(Virtual Key ),也就是用一些有意义的符号或代码来代替之,以便应用程式能够处理;例如一般键盘上都有两个「Enter」键(第二个在键盘最右下角),它们在硬体上的扫描码(Scan Code)一定不同,但虚拟码(Virtual Key)都是 VK_RETURN (CharCode=13),一般在高阶的程式应用中,大部分都只会针对虚拟码(Virtual Key)做处理,这样做的好处是可以将硬体隔离于应用程式之外。 

 

在一个 Windows 程式里,若有某键被按下,会有两个讯息送到程式本身,一个称之为 WM_KEYDOWN,几乎键盘任何按键都会送出;而另一个讯息称之为 WM_CHAR,只有在数值或字母按键被按下时才会送出;换句话说,若是按下了 「A」键,会同时得到 WM_KEYDOWN 及 WM_CHAR 两个讯息,按下了 「F1」却只会得到 WM_KEYDOWN 讯息。 

 

OnKeyDown事件处理程序对应于 WM_KeyDown 讯息, OnKeyPress事件处理程序则对应于 WM_CHAR讯息 (OnKeyPress事件干脆改名叫 OnChar 事件比较容易让人理解),所以 OnKeyDown事件处理程序传入的 key 变数是 WORD 型态,而 OnKeyPress 事件处理程序传入的 key 变数是 char 型态。 

 

由上面的介绍可以知道,要侦测所有的按键(包含文数字及所有功能键)要用OnKeyDown事件处理程序来做,侦测范围会比较广,但有个键例外,那就是「Tab」键;按下 Tab 键会转移元件焦点(Focus),且不会触发 OnKeyDown及OnKeyPress 事件;另外,OnKeyDown事件也只能侦测到键盘虚拟码(Virtual Key)层级,它虽几乎可侦测所有的按键,但它无法分辨按下的是左边的 Shift或是右边的Shift?或按下的是两个 Enter 键中的哪一个?所以,要能分辨所有按键个体,必须能够侦测到键盘的硬体扫描码(Scan Code)层级。 

 

侦测键盘上所有按键个体 

 

在 Form 中有个 OnShortCut 事件处理程序,抓取其传入的 Msg 变数就可以完全侦测所有按键个体,更令人兴奋的是它连 Tab 键都能抓得到,原因是从 Msg 变数中可以直接抓出键盘的硬体扫描码(Scan Code);如欲抓取扫描码可读出 Msg.KeyData值,抓取虚拟码(Virtual Key) 则可读出 Msg.CharCode 值。以下整理出跟按键侦测有关的事件处理程序及其侦测范围: 

 

OnKeyPress 只能抓到数值或字母按键及 Esc键、空白键,但不含功能键(F1-F12) 

OnKeyDown 能抓到所有的键(除 Tab 键)但不能分辨「对称键」的不同 

OnShortCut 能抓到所有的键(含 Tab 键)且能分辨「对称键」的不同 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄贤秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值