每一个点都很值得研究,这都是皮毛。

       1、扫描码与虚拟码

 

键盘从最早的83键发展到当今流行的101键,虽然增加了许多键,但按键的基本操作保持不变,即按下一个键或释放一个键。按下一个键或释放一个键时,键盘设备就产生一个扫描码(ScanCode),这些扫描码是键盘的物理码,每一个扫描码可以惟一地确定一个按键。不同厂家生产的键盘,其扫描码有可能是不一样的,即它是与设备相关的。键盘上的每个键对应两个不同的扫描码,当键被按下时,产生的扫描码的最高位为0,当键被释放时,产生的扫描码的最高位为1。为了实现与设备无关的键盘操作,Windows系统中定义了一个虚拟键盘。虚拟键盘不但包括了目前键盘所使用的标准键集,还定义了一些目前键盘上所没有的虚拟键,以便以后进行扩充。在虚拟键盘上,每个键对应一个虚拟码(VirtualKeyCode)。Windows的键盘驱动程序(Keybord.drv)将各种不同的物理键盘映射到同一个虚拟键盘,程序员处理的是这惟一的虚拟键。这样,用户所编写的有关键盘的程序就与具体的键盘设备无关了。表-1所示为常用的虚拟键代码。

表-1 常用的虚拟键代码

 

就像用户移动或单击鼠标键时Windows会给应用程序发送消息一样,当用户敲击键盘时,Windows也同样会给应用程序发送消息,鼠标消息和键盘消息的区别在于鼠标消息被发送到鼠标所处的窗口,而键盘消息总是被发送给有输入焦点的窗口,通常是屏幕上最前面的窗口。

Windows的键盘消息分为击键消息和字符消息两类。

 

       2、击键消息

 

对于键盘上的所有键,每次按下或释放时,都会产生击键消息。击键消息主要有4种,分别为WM_KEYDOWN(键按下)、WM_SYSKEYDOWN(系统键按下)、WM_KEYUP(弹起)、WM_SYSKEYUP(系统键弹起)。WM_SYSKEYDOWN和WM_SYSKEYUP消息称做系统击键消息,它们由F10键或含有Alt键的击键组合产生,用于快速激活菜单及菜单中的选项、切换当前窗口和其他系统消息。Windows使用默认处理函数DefWindowProc()来对这类消息进行处理,应用程序常常忽略它们

WM_KEYDOWN和WM_KEYUP消息称做非系统击键消息,用户每按一个非系统键,都会产生这类消息,它是应用程序中重点处理的消息。在一些游戏程序中,用户常常按动“←”、“↑”、“→”、“↓”键来实现窗口中图形的移动,开发商处理的键盘消息就是这些非系统击键消息。当应用程序不处理时,由默认的处理函数DefWindowProc()对这类消息进行处理。

 

       3、字符消息

 

当按了键盘上的任何一个键时,Windows都会向窗口函数发送击键消息,对于那些产生可显示字符的操作,Windows还会向窗口函数发送字符消息。因此,字符消息不是由硬件产生的,而是由可产生显示字符的击键消息转换而来的

可以这样认为:当按了任何键时都产生击键消息,而当按了那些可显示的字符键时,除了发送击键消息外,还发出字符消息。因此, 当按了可显示字符A键时,将产生WM_KEYDOWN、WM_CHAR、WM_KEYUP消息:当按了不可显示字符Shift键时,将产生WM_KEYDOWN和WM_KEYUP消息。

由于用户击键方式和击键次序的不同,窗口函数所接收到的消息数目和次序也不相同。表-2列出了一些击键与消息的对应关系。

表-2 击键与消息的对应关系

 

        4、键盘消息的实例

 

【例】 本程序实现在客户区画矩形或椭圆,按C键显示椭圆,按R键显示矩形;当按“←”、“↑”、“→”、“↓”键时,屏幕上的图形相应移动。

本程序练习键盘的字符消息WM_CHAR和击键消息WM_KEYDOWN。其具体实现步骤为:

(1)生成应用程序框架

利用应用程序向导MFC AppWizard(exe)创建一个单文档的应用程序框架,该工程的名称为KeyMsg,每个操作步骤都使用默认的选项。

(2)在视图类CKeyMsgView中添加数据成员

要想在屏幕上画一个矩形或椭圆,关键是要传递一个矩形对象。为此,要在视图类中添加一个矩形变量m_Rect。

在工程KeyMsg的工作区中,选择ClassView选项卡,在类名列表框中选择视图类CKeyMsgView,然后单击鼠标右键,在弹出的快捷菜单中选择Add Member Variable命令。在Variable Type文本框中输入CRect,在Variable Name文本框中输入m_Rect,选择Access(访问控制属性)为Protected(保护)。最后单击OK按钮,则在视图类CKeyMsgView中添加了一个CRect的保护成员变量m_Rect,用于存放显示椭圆或矩形的参数。

另外,为了确定是画圆还是画矩形,需要在视图类中添加一个Bool型的成员变量m_IsCircle。当该值为真时,代表画圆:为假时,代表画矩形。添加的方法同上。

(3)对成员变量m_Rect进行初始化

在视图类CKeyMsgView的构造函数中添加如下的代码可以实现对数据成员的初始化。

 

CKeyMsgView::CKeyMsgView(){m_Rect=CRect(10,10,100,100); //圆或矩形的初始位置m_IsCircle=true; //刚开始要画一个圆}

(4)添加字符消息的映射函数

选择“View|ClassWizard”命令,弹出MFC ClassWizard对话框,在Class name列表框中选择CKeyMsgView,在Messages列表框中选择WM_CHAR,然后单击Add Function按钮,这样就为视图类添加了WM_CHAR的消息处理函数OnChar,如图9.4所示。

最后,单击Edit Code按钮,光标自动定位到OnChar()实现处,在该消息映射函数中添加的代码如下:

 

void CKeyMsgView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){//TODO: Add your message handler code here and/or call defaultbool nOldShape=m_IsCircle;//保存旧的图形形状,上一次图形代码和这一次的图形代码不一样时才重新绘图switch (nChar){case 'c':case 'C':m_IsCircle=true; //圆的代码break;case 'r':case 'R':m_IsCircle=false; //矩形的代码break;}if(nOldShape!=m_IsCircle)InvalidateRect(m_Rect);/*若当前按的键与前一次的不同,则调用InvalidateRect(),该函数使得屏幕的指定矩形区域无效,它发送WM_PAINT消息,从而间接地调用OnDraw(CDC*pDC)函数,使得整个屏幕重新绘制一遍*/CView::OnChar(nChar, nRepCnt, nFlags);}

(5)添加击键消息的映射函数

与上一步类似,用ClassWizard为视图类CKeyMsgView添加击键消息WM_KEYDOWN的消息映射函数OnKeyDown(),并在该函数中添加如下代码,用于移动屏幕上的图形。

 

void CKeyMsgView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){//TODO: Add your message handler code here and/or call defaultCPoint ptOffSet=CPoint(0, 0);//偏移点为(0, 0)switch(nChar){case VK_LEFT:ptOffSet=CPoint(-2,0);//左移两个像素break;case VK_RIGHT:ptOffSet=CPoint(2, 0); //右移break;case VK_UP:ptOffSet=CPoint(0,-2);//上移break;case VK_DOWN:ptOffSet=CPoint(0, 2);//下移break;}m_Rect.OffsetRect(ptOffSet); //使得矩形偏移Invalidate(); //刷新屏幕CView::OnKeyDown(nChar, nRepCnt, nFlags);}

(6)重载视图类的虚函数OnDraw(),实现屏幕图形的绘制

 

void CKeyMsgView::OnDraw(CDC* pDC){CKeyMsgDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if(m_IsCircle) //如果画圆pDC->Ellipse(m_Rect); //画圆else//如果不是画圆的话pDC->Rectangle(m_Rect);//画矩形}

原文:http://m.blog.csdn.net/blog/budingningmeng/8481109

Windows 编程常用键盘消息命令相关推荐

  1. windows编程常用系统API函数

    windows编程常用API的函数 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 6. API之菜单函数 7. AP ...

  2. [运维笔记] - (命令).Windows server常用网络相关命令

    [运维] - Windows server网络相关命令 注:内容通过Microsoft文档整体和翻译,仅用于便于维护工作时查询. 资料翻译者:jcLee95 邮箱:291148484@163.com ...

  3. windows编程之鼠标消息总结

    1 确定鼠标是否存在:fMouse = GetSystemMetrics (SM_MOUSEPRESENT) ; 2 获取鼠标上按键数目:cButtons = GetSystemMetrics (SM ...

  4. 前端windows下常用的CMD 命令归纳

    前言:在vue项目开发或安装部署卸载时候经常会用到CMD命令操作,所以这里将常用到的cmd命令进行归纳. ·在运行框或cmd界面输入以下代码,回车键确定跳转对应的功能或界面    shutdown   ...

  5. *♎* WINDOWS编程常用API函数 *♎*

    1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接  WNetAddConnection2 创建同一个网络资源的连接  WNetAddConnection3 创 ...

  6. Windows 编程[9] - WM_CLOSE 消息

    本例效果图: program Project1;usesWindows, Messages;{供 WM_CLOSE 消息调用的自定义过程} procedure OnClose(h: HWND); be ...

  7. Windows 编程[8] - WM_PAINT 消息

    本例效果图: program Project1;usesWindows, Messages;{供 WM_PAINT 消息调用的自定义过程} procedure OnPaint(h: HWND); co ...

  8. Windows 编程[11] - WM_SIZE 消息

    本例效果图: program Project1;usesWindows, Messages;{供 WM_SIZE 消息调用的自定义过程} procedure OnSize(h: HWND); varR ...

  9. Windows编程捕获特定窗口及键盘鼠标消息模拟

    Windows编程捕获特定窗口及键盘鼠标消息模拟 一.简介 二.使用到的API简介 三.获取Windows记事本的编辑区窗口的句柄并模拟输入操作 1.分析 2.代码一 3.代码二 四.后记 一.简介 ...

最新文章

  1. python windows错误码
  2. C++ Primer 第九章 顺序容器
  3. 第十五周程序阅读-范型程序设计(2)
  4. 扫盲了!一个Java字符串中到底有多少个字符?
  5. Hive的基本操作-创建外部表
  6. 关于爬虫中遇到的问题
  7. c语言抬起按键,c语言获得键盘的按键
  8. CSS 制作手风琴导航
  9. 做老板必须要有正气和底气,所谓正气就是身正不怕影子斜
  10. spring data mongodb CURD
  11. 精锐万能票据打印专家
  12. java零基础自学教程视频,详细说明
  13. 小白学电脑计算机的组成,新手学电脑步骤,从零开始学电脑
  14. 大学计算机基础知识电子版,(完整版)大一大学计算机基础课程知识点.pdf
  15. 一台电脑中,如何使 git 同时配置Github、Gitee等多种版本控制工具
  16. 苹果库乐队怎么玩_iPhone技巧丨苹果手机制作炫酷铃声,就是不一样!
  17. Android 清理应用缓存
  18. imageJ把两张图片在时间轴上进行合并
  19. SQL Server电影院数据库管理系统【英文版-源码】--(Movie Theatre Management System Database)
  20. 揭秘经典案例炼成之道 微信开发者大会精华回顾

热门文章

  1. html图片如何复制到剪贴板,js 如何实现复制图片到剪切板
  2. 让我们并肩作战—机房合作
  3. Git教程By廖雪峰 高清完整+完整目录PDF版---分支
  4. 列举一些 MacBook Pro 必需的外设和应用程序推荐
  5. X-Plane 9 极速入门
  6. TIOBE 6月编程语言排行榜:C语言仍为榜首,Java紧随其后!
  7. Vue登录拦截 登录后继续跳转指定页面
  8. 基本知识:block/sleep/hang/宕机/hook/stub/offload/overhead/watermark
  9. oracle exadata 多少钱,oracle exadata
  10. 【Spring学习】过滤器和拦截器