键盘(键盘基础按键消息)

上传人:枫** 文档编号:489662087 上传时间:2024-02-26 格式:DOCX 页数:61 大小:34.04KB
返回 下载 相关 举报
键盘(键盘基础按键消息)_第1页
第1页 / 共61页
键盘(键盘基础按键消息)_第2页
第2页 / 共61页
键盘(键盘基础按键消息)_第3页
第3页 / 共61页
键盘(键盘基础按键消息)_第4页
第4页 / 共61页
键盘(键盘基础按键消息)_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《键盘(键盘基础按键消息)》由会员分享,可在线阅读,更多相关《键盘(键盘基础按键消息)(61页珍藏版)》请在金锄头文库上搜索。

1、键盘(键盘基础,按键消息)在 Microsoft Windows 98 中,键盘和鼠标是两个标准 的使用者输入来源,在一些连贯操作中常产生互补作 用。当然,鼠标在今天的应用程序中比十年前使用得 更为广泛。甚至在一些应用程序中,我们更习惯于使 用鼠标,例如在游戏、画图程序、音乐程序以及 Web 浏览器等程序中就是这样。然而,我们可以不使用鼠 标,但绝对不能从一般的 PC 中把键盘拆掉。相对于个人计算机的其它组件,键盘有非常久远的历 史,它起源于 1874 年的第一台 Remington 打字机。早 期的计算机程序员用键盘在 Hollerith 卡片上打孔,后 来在终端机上用键盘直接与大型主机沟通

2、。PC上的键 盘在某些方面进行了扩充,加上了功能键、光标移动 键和单独的数字键盘,但它们的输入原理基本相同。键盘基础 您大概已经猜到 Windows 程序是如何获得键盘输入 的:键盘输入以消息的形式传递给程序的窗口消息处 理程序。实际上,第一次学习消息时,键盘事件就是 一个消息如何将不同型态信息传递给应用程序的显 例。Windows 用八种不同的消息来传递不同的键盘事件。 这好像太多了,但是(就像我们所看到的一样)程序 可以忽略其中至少一半的消息而不会有任何问题。并 且,在大多数情况下,这些消息中包含的键盘信息会 多于程序所需要的。处理键盘的部分工作就是识别出 哪些消息是重要的,哪些是不重要的

3、。忽略键盘虽然键盘是 Windows 程序中使用者输入的主要来源, 但是程序不必对它接收的所有消息都作出响应。Windows 本身也能处理许多键盘功能。例如,您可以忽略那些属于系统功能的按键,它们通 常用到 Alt 键。程序不必监视这些按键,因为 Windows 会将按键的作用通知程序(当然,如果程序想这么做, 它也能监视这些按键)。虽然呼叫程序菜单的按键将通 过窗口的窗口消息处理程序,但通常内定的处理方式 是将按键传递给DefWindowProc。最终,窗口消息处 理程序将获得一个消息,表示一个菜单项被选择了。通常,这是所有窗口消息处理程序需要知道的(在第 十章将介绍菜单)。有些 Windo

4、ws 程序使用键盘快捷键来启动通用菜 单项。快捷键通常是功能键或字母同Ctrl键的组合(例 如, Ctrl-S 用于保存文件)。这些键盘快捷键与程序菜 单一起在程序的资源描述文件中定义(我们可以在第 十章看到)。 Windows 将这些键盘快捷键转换为菜单命 令消息,您不必自己去进行转换。对话框也有键盘接口,但是当对话框处于活动状态时, 应用程序通常不必监视键盘。键盘接口由Windows处 理, Windows 把关于按键作用的消息发送给程序。对 话框可以包含用于输入文字的编辑控件。它们一般是 小方框,使用者可以在框中键入字符串。 Windows 处 理所有编辑控件逻辑,并在输入完毕后,将编辑

5、控件 的最终内容传送给程序。关于对话框的详细信息,请 参见第十一章。编辑控件不必局限于单独一行,而且也不限于只在对 话框中。一个在程序主窗口内的多行编辑控件就能够 作为一个简单的文字编辑器了(参见第九、十、十一 和十二章的POPPAD程序)。Windows甚至有一个Rich Text 文字编辑控件,允许您编辑和显示格式化的文字 ( 请 参 见 /Platform SDK/User Interface Services/Controls/Rich Edit Controls)。您将会发现,在开发 Windows 程序时,可以使用处理 键盘和鼠标输入的子窗口控件来将较高层的信息传递 回父窗口。只要

6、这样的控件用得够多,您就不会因处 理键盘消息而烦恼了。谁获得了焦点与所有的个人计算机硬件一样,键盘必须由在 Windows 下执行的所有应用程序共享。有些应用程序 可能有多个窗口,键盘必须由该应用程序内的所有窗 口共享。回想一下,程序用来从消息队列中检索消息的 MSG 结构包括 hwnd 字段。此字段指出接收消息的窗口控 件码。消息循环中的 DispatchMessage 函数向窗口消 息处理程序发送该消息,此窗口消息处理程序与需要 消息的窗口相联系。在按下键盘上的键时,只有一个 窗口消息处理程序接收键盘消息,并且此消息包括接 收消息的窗口控件码。接收特定键盘事件的窗口具有输入焦点。输入焦点的

7、 概念与活动窗口的概念很相近。有输入焦点的窗口是 活动窗口或活动窗口的衍生窗口(活动窗口的子窗口, 或者活动窗口子窗口的子窗口等等)。通常很容易辨别活动窗口。它通常是顶层窗口也就 是说,它的父窗口句柄是NULL。如果活动窗口有标 题列, Windows 将突出显示标题列。如果活动窗口具 有对话框架(对话框中很常见的格式)而不是标题列, Windows 将突出显示框架。如果活动窗口目前是最小 化的, Windows 将在工作列中突出显示该项,其显示 就像一个按下的按钮。如果活动窗口有子窗口,那么有输入焦点的窗口既可 以是活动窗口也可以是其子窗口。最常见的子窗口有 类似以下控件:出现在对话框中的下

8、压按钮、单选钮、 复选框、滚动条、编辑方块和清单方块。子窗口不能 自己成为活动窗口。只有当它是活动窗口的衍生窗口 时,子窗口才能有输入焦点。子窗口控件一般通过显 示一个闪烁的插入符号或虚线来表示它具有输入焦 点。有时输入焦点不在任何窗口中。这种情况发生在所有 程序都是最小化的时候。这时,Windows将继续向活 动窗口发送键盘消息,但是这些消息与发送给非最小 化的活动窗口的键盘消息有不同的形式。窗 口 消 息 处 理 程 序 通 过 拦 截 WM_SETFOCUS 和 WM_KILLFOCUS 消息来判定它的窗口何时拥有输入 焦点。 WM_SETFOCUS 指示窗口正在得到输入焦点, WM_K

9、ILLFOCUS 表示窗口正在失去输入焦点。我将 在本章的后面详细说明这些消息。队列和同步当使用者按下并释放键盘上的键时, Windows 和键盘 驱动程序将硬件扫描码转换为格式消息。然而,这些 消息并不保存在消息队列中。实际上, Windows 在所 谓的系统消息队列中保存这些消息。系统消息队 列是独立的消息队列,它由 Windows 维护,用于初步 保存使用者从键盘和鼠标输入的信息。只有当 Windows 应用程序处理完前一个使用者输入消息时, Windows 才会从系统消息队列中取出下一个消息,并 将其放入应用程序的消息队列中。此过程分为两步:首先在系统消息队列中保存消息, 然后将它们放

10、入应用程序的消息队列,其原因是需要 同步。就像我们刚才所学的,假定接收键盘输入的窗 口就是有输入焦点的窗口。使用者的输入速度可能比 应用程序处理按键的速度快,并且特定的按键可能会 使焦点从一个窗口切换到另一个窗口,后来的按键就 输入到了另一个窗口。但如果后来的按键已经记下了 目标窗口的地址,并放入了应用程序消息队列,那么 后来的按键就不能输入到另一个窗口。按键和字符 应用程序从Windows接收的关于键盘事件的消息可以 分为按键和字符两类,这与您看待键盘的两种方式一致。首先,您可以将键盘看作是键的集合。键盘只有唯一 的 A 键,按下该键是一次按键,释放该键也是一次按 键。但是键盘也是能产生可显

11、示字符或控制字符的输 入设备。根据Ctrl、Shift和Caps Lock键的状态,A 键能产生几个字符。通常情况下,此字符为小写 a。 如果按下Shift键或者打开了 Caps Lock,则该字符就 变成大写A。如果按下了 Ctrl,则该字符为Ctrl-A (它 在ASCII中有意义,但在Windows中可能是某事件的 键盘快捷键)。在一些键盘上,A按键之前可能有死 字符键(dead-character key)或者 Shift、Ctrl 或者 Alt 的不同组合,这些组合可以产生带有音调标记的小写 或者大写,例如,d、d、狻20、或拧?/p对产生可显示字符的按键组合, Windows 不仅

12、给程序 发送按键消息,而且还发送字符消息。有些键不产生 字符,这些键包括shift键、功能键、光标移动键和特 殊字符键如Insert和Delete。对于这些键,Windows 只产生按键消息。按键消息 当您按下一个键时,Windows把 WM_KEYDOWN或 者 WM_SYSKEYDOWN 消息放入有输入焦点的窗口 的 消 息 队 列 ; 当 您 释 放 一 个 键 时 , Windows 把 WM_KEYUP 或者 WM_SYSKEYUP 消息放入消息队 列中。表 6-1键按下键释放非系统键WM_KEYDOWNWM_KEYUP系统键WM_SYSKEYDOWNWM_SYSKEYUP通常dow

13、n (按下)和up (放开)消息是成对出 现的。不过,如果您按住一个键使得自动重复功能生 效,那么当该键最后被释放时, Windows 会给窗口消 息 处 理 程 序 发 送 一 系 列 WM_KEYDOWN ( 或 者 WM_SYSKEYDOWN)消息和一个WM_KEYUP (或 者WM_SYSKEYUP)消息。像所有放入队列的消息 一 样 , 按 键 消 息 也 有 时 间 信 息 。 通 过 呼 叫 GetMessageTime,您可以获得按下或者释放键的相对 时间。系统按键与非系统按键WM_SYSKEYDOWN 和 WM_SYSKEYUP 中的SYS 代表系统,它表示该按键对 Wind

14、ows 比对 Windows 应 用 程 序 更 加 重 要 。 WM_SYSKEYDOWN 和 WM_SYSKEYUP 消息经常由与 Alt 相组合的按键产 生,这些按键启动程序菜单或者系统菜单上的选项, 或者用于切换活动窗口等系统功能( Alt-Tab 或者 Alt-Esc),也可以用作系统菜单快捷键(Alt键与一个 功能键相结合,例如 Alt-F4 用于关闭应用程序)。程 序 通 常 忽 略 WM_SYSKEYUP 和 WM_SYSKEYDOWN 消 息 , 并 将 它 们 传 送 到 DefWindowProc。由于 Windows要处理所有 Alt键的 功能,所以您无需拦截这些消息。

15、您的窗口消息处理 程序将最后收到关于这些按键结果(如菜单选择)的 其它消息。如果您想在自己的窗口消息处理程序中加 上 拦 截 系 统 按 键 的 程 序 代 码 ( 如 本 章 后 面 的 KEYVIEW1 和 KEYVIEW2 程序所作的那样),那么 在 处 理 这 些 消 息 之 后 再 传 送 到 DefWindowProc , Windows 就仍然可以将它们用于通常的目的。但是,请再考虑一下,几乎所有会影响使用者程序窗 口的消息都会先通过使用者窗口消息处理程序。只有使用者把消息传送到 DefWindowProc,Windows 才会对消息进行处理。例如,如果您将下面几行叙述:case

16、WM_SYSKEYDOWN:caseWM_SYSKEYUP:caseWM_SYSCHAR:return 0 ;加入到一个窗口消息处理程序中,那么当您的程序主 窗口拥有输入焦点时,就可以有效地阻止所有 Alt 键 操作(我将在本章的后面讨论 WM_SYSCHAR),其 中包括 Alt-Tab、Alt-Esc 以及菜单操作。虽然我怀疑 您会这么做,但是,我相信您会感到窗口消息处理程 序的强大功能。WM_KEYDOWN 和 WM_KEYUP 消息通常是在按下 或者释放不带 Alt 键的键时产生的,您的程序可以使 用或者忽略这些消息, Windows 本身并不处理这些消 对所有四类按键消息,wParam是虚拟键代码,表示按 下或释放的键,而 lParam 则包含属于按键的其它数 据。虚拟键码虚拟键码保存在 WM_KEYDOWN、WM_KEYUP、

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号