您的位置:首页 > 编程语言 > Delphi

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 键)且能分辨「对称键」的不同
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: