Delphi中的OnKeyDown事件等等
2014-03-27 08:36
190 查看
键盘扫描码处理
在键盘按键被押下时,第一个会产生的是所谓的扫描码(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 键)且能分辨「对称键」的不同
在键盘按键被押下时,第一个会产生的是所谓的扫描码(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 键)且能分辨「对称键」的不同
相关文章推荐
- 理解 Delphi 的类(四) - 初识类的事件
- 委托、事件、动态连接库、反射、动态连接库等等等等,其本质都是函数指针。
- 通过onkeypress和onkeydown事件禁用键盘中某些键
- JS中使用onkeydown事件来实现键盘效果
- Delphi处理TWebBrowser的Close事件
- 获取当前事件的节点等等
- Delphi 拦截滚轮事件不响应滚轮的上下滚动
- Delphi XE7 用indy开发微信公众平台(5)- 接收事件推送
- Delphi事件的广播
- delphi 让ScrollBox响应鼠标滚轮事件
- Delphi 属性、函数、事件参考
- 一个灵巧的Delphi多播实事件现方案.
- Delphi 模拟无ID无NAME 图片 点击事件
- Delphi编写事件模型客户端(3) 推荐
- Delphi事件的广播2
- Delphi 事件到地址转换工具 v2.020 汉化版 by cxj98 / RCFF Team
- Delphi ComboBox的属性和事件、及几个鼠标事件的触发
- Windows消息机制和Delphi的事件驱动机制
- Android WebView的前进、后退、与刷新以及OnkeyDown事件 和 OnBackPressed方法注意点
- Delphi常用属性和事件