第5讲 Windows应用程序中的键盘与鼠标
第5讲 Windows应用程序中的键盘与鼠标
6.1键盘在应用程序中的应用 键盘上的键 TM 个唯一的标识值(扫描 按下或释放某键时一生 扫描码是依赖于具体设备的,为达到设备无关性的要求,往往使用与具体设备 无关的虚拟码,虚拟码是由 Windows系统定义的与设备无关的键的标识 设备驱动程序翻译 由于键盘的输入 截取键的扫描码 虚拟码 9>产生一条 扫描码、虚拟码以及其他与击键有关的消息 消息设备驱动程序把消息放到系统的 Windows从系统消息队 消息队列中 列中取出消息 取出键盘消息进行处理窗口过程发送到相应的线程消息队列中
扫描码是依赖于具体设备的,为达到设备无关性的要求,往往使用与具体设备 无关的虚拟码,虚拟码是由Windows系统定义的与设备无关的键的标识 由于键盘的输入 产生一条 消息 扫描码、虚拟码以及其他与击键有关的消息 设备驱动程序 截取键的扫描码 翻译 虚拟码 它含 键盘上的键 对应 一个唯一的标识值(扫描码) 按下或释放某键时 产 生 取出键盘消息进行处理 消息 设备驱动程序 把消息放到系统的 消息队列中 Windows从系统消息队 列中取出消息 发送到相应的线程消息队列中 窗口过程 6.1 键盘在应用程序中的应用
虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的 wParam参数中,用以标识哪一个键被按下或释放,最常用的虚拟码 已经在 Windows. h中定义, 常用的虚拟码 符号常量名称 等价的键盘键或 符号常量名称 等价的键盘键或 鼠标按钮 鼠标按钮 VK LBUTTON鼠标左按钮 VK BACK 退格键 VK RBUTTON 鼠标右按钮 VK TAB 制表键 Ⅴ X MBUTTON鼠标中按钮ⅴ K RETURN 回车键 VK SHIFT Shift键 VK CONTROL Ctr键 VK MENU AIt键 VK PAUSE Pause键 VK CAPITAL Caps lock键|ⅴ K ESCAPE Esc链 VK PRIOR Page Up键 VK NEXT Page Down键 VK END End键 VK HOME Home键 VK LEFT 左键头键 VK RIGHT 右箭头键 VK UP 上箭头键 VK DOWN 下箭头键 VKO-VK 9 0~9键ⅴKA~VKZ A~Z键
虚拟码是一种与设备无关的键盘编码,它的值存放在键盘消息的 wParam参数中,用以标识哪一个键被按下或释放,最常用的虚拟码 已经在Windows.h中定义, 常用的虚拟码 符号常量名称 等价的键盘键或 鼠标按钮 符号常量名称 等价的键盘键或 鼠标按钮 VK_LBUTTON 鼠标左按钮 VK_BACK 退格键 VK_RBUTTON 鼠标右按钮 VK_TAB 制表键 VK_MBUTTON 鼠标中按钮 VK_RETURN 回车键 VK_SHIFT Shift 键 VK_CONTROL Ctrl 键 VK_MENU Alt 键 VK_PAUSE Pause 键 VK_CAPITAL Caps Lock 键 VK_ESCAPE Esc 键 VK_PRIOR Page Up 键 VK_NEXT Page Down 键 VK_END End 键 VK_HOME Home 键 VK_LEFT 左键头键 VK_RIGHT 右箭头键 VK_UP 上箭头键 VK_DOWN 下箭头键 VK_0~VK_9 0~9 键 VK_A~VK_Z A~Z 键
操作系统在接收到键盘输入后 把消息发送给具有“输入焦点( (input focus)的窗 应用程序一般有几个窗 口,但当按下某一个键 有“输入焦点” 时,只有一个窗口能接 的窗口应是活 收到该键盘消息,接收 这个键盘消息的窗口称 动窗口或者活 为有“输入焦点”的窗口 动窗口的子窗口 窗口函数通过捕获 WM SETFOCUS和 WM KILLFOCUS消息确 定当前窗口是否具有输入焦点 窗口正在接 窗口失去 收输入焦点 输入焦点
操作系统在接收到键盘输入后 把消息发送给具有“输入焦点(input focus)的窗口 应用程序一般有几个窗 口,但当按下某一个键 时,只有一个窗口能接 收到该键盘消息,接收 这个键盘消息的窗口称 为有“输入焦点”的窗口 有“输入焦点” 的窗口应是活 动窗口或者活 动窗口的子窗口 窗口正在接 收输入焦点 窗口函数通过捕获WM_SETFOCUS和WM_KILLFOCUS消息确 定当前窗口是否具有输入焦点。 窗口失去 输入焦点
一个按键的组合产生了 个可以显示的字符时, 不使用AIt键组合 就产生了一个字符消息 的的按键消息 字符消息 键盘消息 非系统按键消息 按键消息 系统按键消息 按下或松开一个键时 就产生了一按键消息 若应用程序处理了这 些系统键消息,还要调 用 DefWindowsProc(函 AIt键与相关输入键的组合 数,以便不影响系统对 产生的消息,这些键一般 它们的处理 由 Windows系统内部直接 处理,应用程序不处理
键盘消息 按键消息 字符消息 按下或松开一个键时 就产生了一按键消息 一个按键的组合产生了 一个可以显示的字符时, 就产生了一个字符消息 系统按键消息 非系统按键消息 Alt键与相关输入键的组合 产生的消息,这些键一般 由Windows系统内部直接 处理,应用程序不处理 若应用程序处理了这 些系统键消息,还要调 用DefWindowsProc()函 数,以便不影响系统对 它们的处理 不使用Alt键组合 的的按键消息
消息 类 五山 含义 LWM_KEYDOWN非系统。按下了非系统键消息 WM KEYUP 非系统 松开了非系统键消息 WM SYSKEYDOWN系统 按下了系统键消息 WM SYSKEYUP系统 松开了系统键消息 包含了识别按下 的键的虚键码 wParam 按键消息的 两个变量 重复计数位(0~15位) Param<OEM扫描码(16~23位) 扩展键标志(24位) 保留位(25~28位) 关联码(29位) 32位的变量 键的先前状态(位30) 转换状态(31位)
消息 类型 含义 WM_KEYDOWN 非系统 按下了非系统键消息 WM_KEYUP 非系统 松开了非系统键消息 WM_SYSKEYDOWN 系统 按下了系统键消息 WM_SYSKEYUP 系统 松开了系统键消息 按键消息的 两个变量 wParam lParam 32位的变量 重复计数位(0~15位) OEM扫描码(16~23位) 扩展键标志(24位) 保留位(25~28位) 关联码(29位) 键的先前状态(位30) 转换状态(31位) 包含了识别按下 的键的虚键码
在 WinMain函数的消息循环中包含了 TranslateMessage函数, 其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键 盘字符映射成ASCⅢ码后才能产生 WM CHAR消息 WM SYSKEYDOWNX WM SYSKEYUP 按键消息只能产生系统消息 字符消息系统 非系统 WM KEYDOWN和 WM KEYUP 的按键消息只能产生非系统消息 消丸 关型 WM CHAR 非系统 非系统 WM DEADCHAR 非系統非系統死享符 WM SYSCHAR 系统 系统 WM SYSDEADCHAR系統 系统死等
在WinMain函数的消息循环中包含了TranslateMessage函数, 其功能是把按键消息转化为字符消息,但只有当键盘驱动程序把键 盘字符映射成ASCII码后才能产生WM_CHAR消息 消 息 类 型 含 义 WM_CHAR 非系统 非系统字符 WM_DEADCHAR 非系统 非系统死字符 WM_SYSCHAR 系 统 系统字符 WM_SYSDEADCHAR 系 统 系统死字符 字符消息 系统 非系统 WM_KEYDOWN和WM_KEYUP 的按键消息只能产生非系统消息 WM_SYSKEYDOWN和WM_SYSKEYUP 按键消息只能产生系统消息
【6-1】设计一个窗口,在该窗口中练习键盘的响应,要求如下: 1)单击键盘上的向上箭头时,窗口中显示“ You had hitted the up key (2)单击键时,窗口中显示“ You had hitted the shift key” (3)单击键时,窗口中显示“ You had hitted the ctrl key” (4)单击键时,窗口中显示“ You had hitted the ctrl a key” (5)单击键时,窗口中显示“ You had hitted the shift b key' 键盘实例程序 You had hitted the SHIFT B key
【6-1】 设计一个窗口,在该窗口中练习键盘的响应,要求如下: (1) 单击键盘上的向上箭头时,窗口中显示“You had hitted the up key” (2) 单击键时,窗口中显示“You had hitted the SHIFT key” (3) 单击键时,窗口中显示“You had hitted the CTRL key” (4) 单击键时,窗口中显示“You had hitted the CTRL A key” (5) 单击键时,窗口中显示“You had hitted the SHIFT B key
long wInaPlWndProc(HWND hwnd, UINT IMessage, UINT wParam, LONG IParam) RHDC hDC; ∥定义设备环境句柄 PAINTSTRUCT PS; ∥定义包含绘图信息的结构体变量 hEN Pen: ∥定义画笔句柄。 HBRUSHhBrush ∥定义画刷句柄 ∥以下定义输出的字符串。 static char cUp="You had hitted the Up key"; static char cctrll="You had hitted the ctrl key" static char cShift[="You had hitted the shift key" static char cCtrl All=You had hitted the ctrla key; static char cShift Bl=You had hitted the shift b key 下面定义并初始化按键标志变量。 static BOoLnUpkeyDown=FALSE nShiftKeyDown=FALSE, n Down=FALSE, nCtrlAKeyDown=FALSE nShiftBKeydown=FALSE
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) {HDC hDC; //定义设备环境句柄. PAINTSTRUCT ps; //定义包含绘图信息的结构体变量 HPEN hPen; //定义画笔句柄。 HBRUSH hBrush; //定义画刷句柄 //以下定义输出的字符串。 static char cUp[]="You had hitted the UP key"; static char cCtrl[]="You had hitted the Ctrl key"; static char cShift[]="You had hitted the SHIFT key"; static char cCtrl_A[]="You had hitted the CTRL A key"; static char cShift_B[]="You had hitted the SHIFT B key"; //下面定义并初始化按键标志变量。 static BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE;
switch(iMessage) i case WM KEYdoWn: i switch(wParam) i case vK UP: ∥当按上箭头键时,变量置为真 nUpKeyDown= tRUE: break case vK shift: ∥按shif键时,变量置为真 nShiftKeyDown- TRUE; break; case VK CONTRol ∥按 control键时,变量置为真 nCtrlKeyDown=TRUE; break; default: breaks break: case WM KEYUP. Invalidaterect(hWnd, NULL, FALSE); break;
switch(iMessage) { case WM_KEYDOWN: { switch(wParam) { case VK_UP: //当按上箭头键时,变量置为真。 nUpKeyDown = TRUE; break; case VK_SHIFT: //当按shift键时,变量置为真。 nShiftKeyDown = TRUE; break; case VK_CONTROL: //当按control键时,变量置为真 nCtrlKeyDown = TRUE; break; default: break; } } break; case WM_KEYUP: InvalidateRect(hWnd,NULL,FALSE); break;