windows编程常用键盘消息命令
来源:互联网 发布:电子管放大原理 知乎 编辑:程序博客网 时间:2024/06/11 13:37
windows编程常用键盘消息命令
1.扫描码与虚拟码
键盘从最早的83键发展到当今流行的101键,虽然增加了许多键,但按键的基本操作保持不变,即按下一个键或释放一个键。按下一个键或释放一个键时,键盘设备就产生一个扫描码(ScanCode),这些扫描码是键盘的物理码,每一个扫描码可以惟一地确定一个按键。不同厂家生产的键盘,其扫描码有可能是不一样的,即它是与设备相关的。键盘上的每个键对应两个不同的扫描码,当键被按下时,产生的扫描码的最高位为0,当键被释放时,产生的扫描码的最高位为1。为了实现与设备无关的键盘操作,Windows系统中定义了一个虚拟键盘。虚拟键盘不但包括了目前键盘所使用的标准键集,还定义了一些目前键盘上所没有的虚拟键,以便以后进行扩充。在虚拟键盘上,每个键对应一个虚拟码(VirtualKeyCode)。Windows的键盘驱动程序(Keybord.drv)将各种不同的物理键盘映射到同一个虚拟键盘,程序员处理的是这惟一的虚拟键。这样,用户所编写的有关键盘的程序就与具体的键盘设备无关了。表9.3所示为常用的虚拟键代码。
表9.3 常用的虚拟键代码
符号常量
对应按键
符号常量
对应按键
VK_LBUTTON
鼠标左键
VK_0~VK_9
0~9键
VK_RBUTTON
鼠标右键
VK_A~VK_Z
A~Z键
VK_BACK
退格键(BACKSPACE键)
VK_NUMPAD0~9
数字小键盘0~9
VK_RETURN
回车键
VK_MULTIPY
乘号键
VK_SHIFT
Shift键
VK_ADD
加号键
VK_CAPITAL
CapsLock键
VK_SUBTRACT
减号键
VK_ESCAPE
Esc键
VK_F1~VK_F24
F1~F24键
VK_SPACE
SpaceBar键
VK_NUMLOCK
Num Lock键
VK_PRIOR
PageUP键
VK_TAB
制表键(Tab)
VK_NEXT
PageDown键
VK_PAUSE
Pause键
VK_END
End键
VK_INSERT
Ins键
VK_HOME
Home键
VK_DELETE
Del键
VK_LEFT
Left Arrow(←)键
VK_DOWN
Down Arrow(↓)键
就像用户移动或单击鼠标键时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消息。
由于用户击键方式和击键次序的不同,窗口函数所接收到的消息数目和次序也不相同。表9.4列出了一些击键与消息的对应关系。
表9.4 击键与消息的对应关系
击键方式
消息次序
wParam参数
按下A键,然后释放
WM_KEYDOWN
虚拟键A
WM_CHAR
A的ASCII码
WM_KEYUP
虚拟键A
先按Shift键,再按A键,然后释放A键,最后释放Shift键
WM_KEYDOWN
虚拟键VK_SHIFT
WM_KEYDOWN
虚拟键A
WM_CHAR
A的ASCII码
WM_KEYUP
虚拟键A
WM_KEYUP
虚拟键VK_SHIFT
按下A键持续一段时间
WM_KEYDOWN
虚拟键A
WM_CHAR
A的ASCII码
WM_KEYDOWN
虚拟键A
WM_CHAR
A的ASCII码
WM_KEYDOWN
虚拟键A
WM_CHAR
A的ASCII码
WM_KEYUP
虚拟键A
4.键盘消息的实例
【例9.2】 本程序实现在客户区画矩形或椭圆,按C键显示椭圆,按R键显示矩形;当按“←”、“↑”、“→”、“↓”键时,屏幕上的图形相应移动。 程序演示
本程序练习键盘的字符消息WM_CHAR和击键消息WM_KEYDOWN。其具体实现步骤为:
(1)生成应用程序框架
利用应用程序向导MFC AppWizard(exe)创建一个单文档的应用程序框架,该工程的名称为KeyMsg,每个操作步骤都使用默认的选项。
(2)在视图类CKeyMsgView中添加数据成员
要想在屏幕上画一个矩形或椭圆,关键是要传递一个矩形对象。为此,要在视图类中添加一个矩形变量m_Rect。
在工程KeyMsg的工作区中,选择ClassView选项卡,在类名列表框中选择视图类CKeyMsgView,然后单击鼠标右键,在弹出的快捷菜单中选择Add Member Variable命令,则弹出如图9.3所示的对话框。在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所示。
图9.3 添加成员变量对话框
图9.4 类向导对话框
最后,单击Edit Code按钮,光标自动定位到OnChar()实现处,在该消息映射函数中添加的代码如下:
void CKeyMsgView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//TODO: Add your message handler code here and/or call default
bool 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 default
CPoint 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);//画矩形
}
- windows编程常用键盘消息命令
- windows编程常用键盘消息命令
- Windows 编程常用键盘消息命令
- windows编程之键盘消息总结
- windows编程常用消息汇总
- Windows键盘消息处理
- Windows键盘消息
- Windows 键盘消息处理
- Windows编程(4)|SDK键盘鼠标消息的简单处理
- windows基础应用程序编程(六)键盘消息
- 2013.8.7 学习笔记《windows核心编程》(十) 消息队列与键盘消息
- 2013.8.13 学习笔记《windows核心编程》(十一) 键盘消息与翻译消息
- Windows常用键盘快捷键
- vim常用键盘命令
- 键盘快捷键、命令windows
- 《Windows程序设计》读书笔记------------->>键盘消息<<
- windows 键盘消息的机制
- windows的鼠标、键盘消息(阅windows核心编程笔记)
- zoj 1608 Two Circles and a Rectangle
- WinRAR3.7简体中文正式版(麦粉版)+永久授权
- ABAP--关于SAP Control Framework(入门GUI编程的不错的基础介绍)
- Ubuntu应用程序菜单点不开
- ws2_32.dll的用途
- windows编程常用键盘消息命令
- 模型总结
- 2011 4月份我的面试经历和总结,跟大家分享!
- nexus-maven- repository-index.zip手动下载与设置
- SAP Control Framework系列
- WHU CD3 的比赛 @NTR
- eclipse启动时弹出Failed to create the Java Virtual Machine 问题解决
- 关于oracle中update
- poj 1573 1321 递归