|
wProc。由於Windows要处理所有Alt键的功能,所以您无需拦截这些讯息。您的视窗讯息处理程式将最後收到关於这些按键结果(如功能表选择)的其他讯息。如果您想在自己的视窗讯息处理程式中加上拦截系统按键的程式码(如本章後面的KEYVIEW1和KEYVIEW2程式所作的那样),那么在处理这些讯息之後再传送到DefWindowProc,Windows就仍然可以将它们用於通常的目的。
但是,请再考虑一下,几乎所有会影响使用者程式视窗的讯息都会先通过使用者视窗讯息处理程式。只有使用者把讯息传送到DefWindowProc,Windows才会对讯息进行处理。例如,如果您将下面几行叙述:
加入到一个视窗讯息处理程式中,那么当您的程式主视窗拥有输入焦点时,就可以有效地阻止所有Alt键操作(我将在本章的後面讨论WM_SYSCHAR),其中包括Alt-Tab、Alt-Esc以及功能表操作。虽然我怀疑您会这么做,但是,我相信您会感到视窗讯息处理程式的强大功能。
WM_KEYDOWN和WM_KEYUP讯息通常是在按下或者释放不带Alt键的键时产生的,您的程式可以使用或者忽略这些讯息,Windows本身并不处理这些讯息。
对所有四类按键讯息,wParam是虚拟键代码,表示按下或释放的键,而lParam则包含属於按键的其他资料。
虚拟键码
虚拟键码保存在WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN和WM_SYSKEYUP讯息的wParam参数中。此代码标识按下或释放的键。
哈,又是「虚拟」,您喜欢这个词吗?虚拟指的是假定存在於思想中而不是现实世界中的一些事物,也只有熟练使用DOS组合语言编写应用程式的程式写作者才有可能指出,为什么对Windows键盘处理如此基本的键码是虚拟的而不是真实的。
对於早期的程式写作者来说,真实的键码由实际键盘硬体产生。在Windows文件中将这些键码称为「扫描码(scan
codes)」。在IBM相容机种上,扫描码16是Q键,17是W键,18是E、19是R,20是T,21是Y等等。这时您会发现,扫描码是依据键盘的实际布局的。Windows开发者认为这些代码过於与设备相关了,於是他们试图通过定义所谓的 |