




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章键盘程序编程基础 键盘和鼠标是两个标准的用户输入来源 它们在输入过程中起着互补作用 特别是在今天 鼠标在应用程序中的应用比十年前更为广泛 甚至在应用程序中 我们更习惯于使用鼠标 例如在游戏 画图程序 音乐程序以及Web浏览器等程序中就是这样 然而 在一般的PC机中 我们仍然不把鼠标当作必须设备 而把键盘作为必备设备 键盘是个人电脑的组件 键盘有非常久远的历史 它起源於1874年的第一台Remington打字机 早期的电脑程序员用键盘在Hollerith卡片上打孔 後来在终端机上用键盘直接与大型主机沟通 PC上的键盘在某些方面进行了扩充 例如 加上了功能键 游标移动键和单独的附加键盘 数字小键盘 但它们的输入原理基本相同 8 1键盘输入概论 早期的电脑程序员用键盘在Hollerith卡片上打孔 後来在终端机上用键盘直接与大型主机沟通 PC上的键盘在某些方面进行了扩充 例如 加上了功能键 游标移动键和单独的附加键盘 数字小键盘 1 功能键 Alt F1 F10功能键是调动系统功能的按键应用程序一般不必关心 不必监视它们的消息交由Windows系统处理 即给DefWindowProc 函数处理 2 加速键原程序在资源里定义 即 与菜单项绑定 应用程序一般不必关心 不必监视它们的消息交由DefWindowProc 函数处理 8 1键盘输入概论 3 Windows应用程序如何获得键盘的输入呢 键盘的输入 敲键 键盘事件 发送到Windows系统 键盘消息 应用程序 8 1 1键盘的输入焦点 能够接收特定键盘消息的窗口称为具有输入焦点的窗口 那个窗口具有输入焦点可以由Windows系统来决定 也可以由应用程序的窗口函数通过拦截WM SETFOCUS和WM KILLFOCUS消息来判定它的窗口何时拥有或删除输入焦点 程序从消息队列中取出消息 该消息是一个MSG结构 此结构中的hwnd栏目就是指向接收此消息的窗口函数的指针 每个消息都有指向接收消息的hwnd 当然只有这个窗口的窗口函数接收此键盘消息 structMSG HWNDhwnd 接收消息的窗口代号 句柄 UINTmessage 消息名ID号WPARAMwParam 消息参数1LPARAMlParam 消息参数2DWORDtime 消息出现的时间POINTpt 鼠标在屏上的坐标 8 1 2系统消息队列 应用程序消息队列 用户按下 释放按键 Windows和键盘驱动程序 扫描码 系统消息队列 应用程序的消息序列 键盘电路 键盘消息 Windows系统 Windows系统分发 8 2按键 键盘事件 用户按下或释放键盘上的按键键盘事件的表现形式是一个键盘扫描码 键盘消息 Windows和键盘驱动程序将键盘扫描码转换为格式化的键盘消息 键盘消息分类 可以分为按键消息和字符消息两类 字符消息键 对能产生可显示字符的按键 Windows不仅给应用程序发送按键消息 而且还发送字符消息 WM CHAR 非字符消息键 shift键 功能键 光标方向键 特殊字符键 如Insert和Delete Windows只发送 产生 按键消息 8 2 2四个按键消息 桉下按键时 Windows把WM KEYDOWN或者WM SYSKEYDOWN消息放到具有输入焦点的窗口的应用程序队列里释放按键时 Windows把WM KEYUP或者WM SYSKEYUP消息放到具有输入焦点的窗口的应用程序队列里 当桉下按键不放持续一段时间时 Windows会给窗口发送一系列的WM KEYDOWN或者WM SYSKEYDOWN消息 按键消息有四种形式 8 2 3系统按键消息与非系统按键消息 非系统按键消息 WM KEYDOWN和WM KEYUP系统按键消息 WM SYSKEYDOWN和WM SYSKEYUP系统按键 通常是 Alt 另一个键 的组合Alt Tab Alt F4 Alt Esc系统按键的作用是 打开程序的菜单或者系统菜单上的某选项 用于切换活动窗口等系统功能 应用程序一般对WM SYSKEYDOWN和WM SYSKEYUP消息忽略 不感兴趣 即交给DefWindowProc 函数处理 8 2 4虚拟键码 键盘消息发生时 MSG结构体中的wParam表示按下或释放键得到的虚拟键码 而lParam则包含了属於按键的其他信息 虚拟键码 是Windows设计者在WinUser h文件中用识别字定义的一种 键位码 数字 字母的虚拟键码用ASCII码定义 其余都用识别字定义 附加键盘上的虚拟键码是单独定义的 键盘消息structMSG HWNDhwnd 接收消息的窗口代号 句柄 UINTmessage 按键消息名WPARAMwParam 虚拟键码LPARAMlParam 消息参数DWORDtime 消息出现的时间POINTpt 鼠标在屏上的坐标 8 2 4虚拟键码 键盘消息structMSG HWNDhwnd 接收消息的窗口代号 句柄 UINTmessage 按键消息名WPARAMwParam 虚拟键码LPARAMlParam 消息参数DWORDtime 消息出现的时间POINTpt 鼠标在屏上的坐标 8 2 4虚拟键码 键盘消息structMSG HWNDhwnd 接收消息的窗口代号 句柄 UINTmessage 按键消息名WPARAMwParam 虚拟键码LPARAMlParam 消息参数DWORDtime 消息出现的时间POINTpt 鼠标在屏上的坐标 8 2 4虚拟键码 键盘上的字母和数字键的虚拟键码 键盘消息structMSG HWNDhwnd 接收消息的窗口代号 句柄 UINTmessage 按键消息名WPARAMwParam 虚拟键码LPARAMlParam 消息参数DWORDtime 消息出现的时间POINTpt 鼠标在屏上的坐标 8 2 5按键消息的参数lParam 1 重复计数 16 bit 2 OEM扫描码 8 bit 3 扩充键识别字 1 bit 4 环境代码 1 bit 5 键的先前状态 1 bit 6 转换状态 1 bit 图8 1lParam变量中的6个按键栏目 键盘消息structMSG HWNDhwnd 接收消息的窗口代号 句柄 UINTmessage 按键消息名WPARAMwParam 虚拟键码LPARAMlParam 消息参数DWORDtime 消息出现的时间POINTpt 鼠标在屏上的坐标 8 2 6使用GetKeyState函数了解按键的状态 按键的状态 是指某个键盘按钮按下去没有GetKeyState 函数 获得某个键盘按钮的按键的状态 SHORTGetKeyState intnVirtKey nVrtKey 虚拟键码若要求的虚拟键是字母或数字 A Z a z或0 9 nVirtKey必须被置为相应字符的ASCII码值对于其他的键 nVirtKey必须是一虚拟键码 返回值 给出了给定虚拟键的状态最高二进制位为1 则键处于DOWN状态最高二进制位为0 则键为UP状态例子 intiState GetKeyState VK SHIFT if iState 0 MsgBox NULL Shift ShiftisDown MB OK 8 2 6使用GetKeyState 函数了解按键的状态 经常应用 使用虚拟键码常数VK SHIFT VK CONTROL和VK MENU作为nVirtKey参数的值 它给出shift ctrl或alt键的值而不区分左右键区分键的左 右键的情形 使用如下的虚拟键码常数作nVirtKey的值VK LSHIFT VK RSHIFT 左 右Shift键VK LCONTROL VK RCONTROL 左 右Ctrl键VK LMENU VK RMENU 左 右Menu键请注意GetKeyState 的使用 只检查正在处理的键盘信息发生时有关键的按键状态 不能获得和键盘消息无关的其它键的状态 8 2 7按键消息及其使用 四个按键消息仅能表示系统键还是非系统键产生的 是桉下还是释放产生的 要知道是哪个按键产生的消息 则必须要看消息参数wParam lParam WM SYSKEYDOWN和WM SYSKEYUP消息是由Windows系统使用的键盘消息 应用程序编程人员不必为此费心编程员只要处理WM KEYDOWN消息就行了 WM KEYUP消息通常也可以忽略 所以 Windows程序编程人员对不产生字符的按键通常使用WM KEYDOWN消息 switch message caseWM KEYDOWN break 8 2 7按键消息及其使用 上机习题 通过方向键控制方块在窗口的客户区内运动分析 1 变量定义 intx0 10 y0 10 最初的坐标值intx1 x2 y1 y2 intdx 50 dy 50 矩形的长 宽staticintrow 0 line 0 矩形目前所在的行列号2 功能分类 1 画矩形caseWM PAINT hdc BeginPaint hwnd x1 y1 x2 y2 8 2 7按键消息及其使用 上机习题 通过方向键控制方块在窗口的客户区内运动分析 2 获取键盘虚拟码 caseWM KEYDOWN switch wParam caseVK DOWN line break caseVK UP line break caseVK LEFT row break caseVK RIGHT row break if line 20 line 20 if line40 row 40 InvalidateRect hwnd NULL 1 要求重画矩形return0 break 8 2 8为SYSMETS加上键盘界面实现滚动条功能 利用SendMessage函数实现SYSMETS加上键盘界面实现滚动条功能 SendMessage hwnd message wParam lParam 本函数的功能是把message窗口消息及消息参数wParam lParam发送到hwnd所指向的窗口函数 在这里 就是把message发送给它自己这个窗口 8 3字符消息及其处理 桉下每一个按键要产生一个按键消息 但是 对虚拟键码是字符的按键来说还要产生一个字符消息 那么字符消息是怎样产生的呢 这工作由Windows系统为您完成 消息循环中的TranslateMessage函数以msg为参数TranslateMessage 函数作用是 如果此按键消息的虚拟键码是字符按键的码 它将产生一个字符消息 并把字符消息放入应用程序的消息队列 由产生的字符消息把虚拟键码转换为字符的ASCII码或UNICODE码 用户按字符键 按键消息WM KEYDOWN TranslateMessage 函数 字符消息WM CHAR 8 3 2四个字符消息 WM CHAR和WM DEADCHAR消息是从WM KEYDOWN按键消息得到的字符消息 WM SYSCHAR和WM SYSDEADCHAR消息是由WM SYSKEYDOWN系统按键消息得到的字符消息 字符消息的结构与按键消息的结构是一样的lParam参数 与按键消息的lParam参数相同wParam参数 字符的ANSI或Unicode代码 四个字符消息 8 3 3按键消息和字符消息的处理顺序 消息循环中的GetMessage 从消息队列中取到消息 首先得到的是WM KEYDOWN或WM SYSKEYDOWN消息 TranslateMessage 函数将WM KEYDOWN和WM SYSKEYDOWN消息中的虚拟键码进行处理 如果WM KEYDOWN或WM SYSKEYDOWN消息是由字母数字按键产生的 则Windows随之就要产生一个字符消息 此字符消息是夹在按键消息之间传递给窗口函数的 while GetMessage 将消息发送给窗口函数 8 3 3按键消息和字符消息的处理顺序 例如 如果CapsLock未打开 而用户按下再释放A键 则窗口函数将接收到如表8 10所示的三个消息 8 3 3按键消息和字符消息的处理顺序 例如 如果您先按下Shift键 再按下A键 然後释放A键 再释放Shift键 就会输入大写的A 而窗口函数会接收到五个消息 8 3 3按键消息和字符消息的处理顺序 例如 如果用户按住A键 以使自动重复产生一系列的按键消息 那么对每条WM KEYDOWN消息 都会得到一条字符消息 如表8 12所示 8 3 4控制字符键及其处理 什么是控制字符键Tab Enter Backspace Escape键称为控制字符键 它们的虚拟键码就是下表中相应的ASCII代码 它们又称为控制码 控制码还可以用两个键组合产生 例如组合使用Ctrl键与字母键会产生从0 x01 Ctrl A 到0 x1A Ctrl Z 的ASCII控制代码 其中某些控制代码列出如表8 13所示 8 3 4控制字符键及其处理 2 控制字符键的处理 Tab Enter Backspace和Escape键在Windows中 这些控制字符的虚拟键码就是ASII码办法是在处理WM CHAR消息分支中作处理 8 3 4控制字符键及其处理 控制字符的虚拟键码就是ASII码 在处理WM CHAR消息分支中作处理 caseWM CHAR 这是控制字符键产生的字符消息 其他程序码switch wParam 根据wParam中的控制字符码 ASCII 决定下面分支 case b backspace 其处理程序码break case t tab制表符 其处理程序码break case n linefeed 其处理程序码break case r carriagereturn回车 其处理程序码break default charactercodes其他字符码 其处理程序码break return0 8 3 4控制字符键及其处理 上机练习 具有简单的行编辑功能的软件1 定义变量staticcharkeychar 3 存放敲入的字符staticcharstr 201 记录已经敲入过的所有字符intlen 有效字符的个数2 响应WM CHAR消息caseWM CHAR len strlen str if wParam b 8 3 4控制字符键及其处理 上机练习 具有简单的行编辑功能的软件3 显示内容caseWM PAINT hdc BeginPaint hwnd 8 3 5WM DEADCHAR消息 WM DEADCHAR和WM SYSDEADCHAR消息称为 死字符消息 Windows应用程序经常忽略WM DEADCHAR和WM SYSDEADCHAR消息 死字符消息 是怎样产生的 它们的工作方式怎样 在某些非U S 英语键盘上 有些键用於给字母加上音调 本身并不产生字符 这些键称之
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 窗帘设计评审合同
- Unit4 Eat well. Section B(1a-2c) 说课稿 2024-2025学年人教版(2024)七年级英语下册
- 新型页岩气开采技术对2025年生态环境影响评估及效益探讨
- 2025年食品行业食品安全追溯体系与食品安全监管信息化建设实践创新案例研究综述报告
- 主题四 活动二《折叠剪纸有惊喜》教学设计-2024-2025学年劳动三年级上册东北师大版
- 新媒体营销协议
- 2025年防火安全知识题及答案
- 我有一个梦想 马丁·路德·金(新版已删)教学设计-2025-2026学年高中语文人教版必修2-人教版
- 幼儿园教学课件分析
- 2025年数据分析初级笔试模拟卷
- XX镇村级光伏扶贫电站运维管理考核方案
- 植物病虫害防治技能大赛理论题及答案
- 呼吸系统疾病患儿的护理(儿童护理课件)
- 合同范本税代扣
- (正式版)SH∕T 3541-2024 石油化工泵组施工及验收规范
- 固废收购合同范本
- 四川省成都市成华区2023-2024学年八年级下学期期末考试英语试卷
- 养老院合同管理制度执行记录
- 备战2024年高考英语考试易错点16 阅读理解:词义猜测题(4大陷阱)(解析版)
- 电动高尔夫球车使用手册(中文版)
- 施工配电房设置要求
评论
0/150
提交评论