Windows Api教案5.docx
《Windows Api教案5.docx》由会员分享,可在线阅读,更多相关《Windows Api教案5.docx(35页珍藏版)》请在冰豆网上搜索。
WindowsApi教案5
第五章键盘
一键盘基础
⒈扫描码
当每按下一个键或者释放一个键,键盘设备就产生一个扫描码,这些扫描码可以唯一地确定相应的键。
每个键可以产生两个不同的扫描码,当键按下时,产生的扫描码最高有效位为0,当键释放时,产生的扫描码最高有效位为1。
譬如,Esc的扫描码为1,数字键1、2、3的扫描码为2、3、4等。
⒉虚拟键盘
为了提供与设备无关的键盘操作,Windows定义了一个虚拟键盘。
虚拟键盘不但包括了目前键盘所用的标准键集,还定义了一些目前键盘上没有的虚拟键,以便将来进行适当的扩充。
由Windows通过键盘驱动程序将各种不同的物理键盘映射到同一个虚拟键盘上,而应用程序只需处理这唯一的虚拟键盘的输入即可。
⒊虚拟键表
下表列出了绝大多数Windows定义的虚拟键的键码,这些虚拟键均带有前缀VK_。
虚拟键表
十进
制值
十六进
制值
Windows中定义的标识符
IBMPC键盘中相应的键
是否必须
1
01
VK_LBUTTON
鼠标左键
否
2
02
VK_RBUTTON
鼠标右键
否
3
03
VK_CANCEL
Ctrl-Break
是
4
04
VK_MBUTTON
鼠标中键
否
8
08
VK_BACK
Backspace
是
9
09
VK_TAB
Tab
是
12
0C
VK_CLEAR
NumLock关闭时数字键盘5
否
13
0D
VK_RETURN
Enter
是
16
10
VK_SHIFT
Shift
是
17
11
VK_CONTROL
Ctrl
是
18
12
VK_MENU
Alt
是
19
13
VK_PAUSE
Pause
否
20
14
VK_CAPTIAL
CapsLock
是
27
1B
VK_ESCAPE
Esc
是
32
20
VK_SPACE
Spacebar
是
33
21
VK_PRIOR
PageUp
是
34
22
VK_NEXT
PageDown
是
35
23
VK_END
End
是
36
24
VK_HOME
Home
是
37
25
VK_LEFT
LeftArrow
是
38
26
VK_UP
UpArrow
是
39
27
VK_RIGHT
RightArrow
是
40
28
VK_DOWN
DownArrow
是
41
29
VK_SELECT
否
42
2A
VK_PRINT
否
43
2B
VK_EXECUTE
否
44
2C
VK_SNAPSHOT
PrintScreen
否
45
2D
VK_INSERT
Insert
是
46
2E
VK_DELETE
Delete
是
47
2F
VK_HELP
否
48~57
30~39
N/A
主键盘上的0~9
是
65~90
41~5A
N/A
A~Z
是
91
5B
VK_LWIN
左Windows键
否
92
5C
VK_RWIN
右Windows键
否
93
5D
VK_APPS
Applications键
否
96~105
60~69
VK_NUMPAD0~
VK_NUMPAD9
NumLock打开时数字键盘上的0~9
否
106
6A
VK_MULTIPLY
数字键盘上的*键
否
107
6B
VK_ADD
数字键盘上的+键
否
108
6C
VK_SEPARATER
否
109
6D
VK_SUBTRACT
数字键盘上的-键
否
110
6E
VK_DECIMAL
数字键盘上的·键
否
111
6F
VK_DIVIDE
数字键盘上的/键
否
112~121
70~79
VK_F1~VK_F10
功能键F1~F10
是
122~135
7A~87
VK_F11~VK_F24
功能键F11~F24
否
144
90
VK_NUMLOCK
NumLock
否
155
91
VK_SCROLL
ScrollLock
否
二键盘消息
Windows中的键盘消息分为两大类,即击键消息和字符消息。
对于键盘上的所有键,每次按下或者释放时,都会产生击键消息。
但是,只有那些产生可显示字符或控制字符的键,才会产生字符消息。
对于产生可显示字符或者控制字符的击键或击键组合,Widows不仅向应用程序发送击键消息,而且还发送字符消息。
对于不产生可显示字符或控制字符的键,系统只发送击键消息而不发送字符消息。
⒈击键消息
①分类
WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP。
在通常情况下,按下键和释放键消息是成对出现的。
如果按住一个键不放达到一定时间,会激活系统自动重复功能,在这种情况下,当该键最终被释放的时候,系统会给相应的窗口过程发送一系列WM_KEYDOWN(或WM_SYSKEYDOWN)消息和一个WM_KEYUP(或WM_SYSKEYUP)消息。
②系统击键消息
该类型消息通常由含有Alt键的击键组合产生,用于快速激活菜单及菜单中的选项、切换当前窗口和其他系统操作。
这些消息通常由系统处理,应用程序通常忽略系统击键消息,而由窗口函数将这些消息交由系统默认处理函数DefWindowProc去处理。
③击键消息参数
参数wParam中是虚拟键代码,用于指定所按下或者释放的键。
参数lParam包含了与击键消息相关的其他有用信息。
LParam的32位共分为6个部分,见下图:
31
30
29
24
23
16
15
0
说明:
◆重复次数
重复次数表示该消息代表的击键次数。
在通常情况下,重复次数的值为1。
如果按住一个键不放,则系统将自动重复产生该键的击键消息WM_KEYDOWN(或WM_SYSKEYDOWN)。
当Windows向消息队列里放置一条WM_KEYDOWN消息(或WM_SYSKEYDOWN消息)时,如果在此之前已经存在相同的击键消息,则系统将相同的消息合并为一条,而将该击键消息的重复计数值加1。
如果重复计数的值大于1,则表明击键的速度大于窗口函数处理键盘消息的速度,此时,窗口函数把WM_KEYDOWN消息看作重复消息。
窗口函数可以根据需要忽略重复计数而将其视为一次击键,或者根据重复计数的值将其作为多次击键来处理。
WM_KEYUP和WM_SYSKEYUP消息的重复计数始终为1。
◆OEM扫描码
OEM扫描码由键盘硬件产生。
◆扩展键标志
该标志仅一位,用来指示按下或释放的键是否为IBM扩展键盘上的键,这些键包括扩展键盘顶部的功能键、非数字键盘上的光标移动键、Insert和Delete等特殊功能键、NumLock键、数字键盘上的“/”键和回车键,以及右Alt键和右Ctrl键等。
如果是扩展键,在该位为1,否则为0。
在通常情况下,应用程序忽略该标志位。
◆Alt键标志
Alt键标志只有一位,用来指示该键是否与Alt键同时被按下。
如果是,则该位为1,否则为0。
◆先前状态标志
该标志也仅一位,用以标识键的先前状态。
如果该键先前被按下,则该位为1,否则为0。
◆过渡状态标志
如果键正被按下,则该位为0;如果键正被释放,则该位为1。
④GetKeyState函数
SHORTGetKeyState(
intiVirtKey//virtual-keycode
);
说明:
其中,唯一的参数iVirtKey用于指定需要检查状态的键,该函数通过将返回的短整数的不同位设置为不同的值,来指示各种不同的按键情况。
例如:
nState=GetKeyState(VK_SHIFT);
这时可检查nState的最高位是否为1来判断Shift键的状态。
nState=GetKeyState(VK_CAPTIAL);
这时可检查nState的最低位是否为1来判断CapsLock键的状态。
⑤GetAsyncKeyState函数
SHORTGetAsyncKeyState(
intvKey//virtual-keycode
);
说明:
该函数与GetKeyState的返回值含义是相同的。
两者的不同之处在于,函数GetKeyState获取的是击键消息产生时指定键的状态,而函数GetAscyncKeyState获取的是执行该语句时指定键的当前状态。
⒉字符消息
对于那些产生可显示字符的操作,Windows还会向窗口函数发送字符消息。
字符消息不是由硬件产生的,而是由击键消息转换而来的。
即由消息循环代码完成的。
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
TranslateMessage函数从WM_KEYDOWN或WM_SYSKEYDOWN击键消息中取得虚拟键码,如果相应的击键操作产生可显示字符,则TranslateMessage把相应的字符消息放入消息队列中,在紧随其后的下一个消息循环中,该字符消息被取出并发往相应的窗口函数。
①分类
WM_CHAR、WM_DEADCHAR、WM_SYSCHAR、WM_SYSDEADCHAR。
前两种由WM_KEYDOWN转换而来,后两种由WM_SYSKEYDOWN转换而来。
在某些非英语的键盘上,有些键用于给字母加音标。
由于它们本身并不产生字符,所以称为“死键”。
一般不处理。
②参数
字符消息的lParam参数与相应的击键消息的lParam参数意义相同,但wParam参数不再是虚拟键码,而是字符代码。
例如:
按下并释放Shift键消息表
消息
键或代码
WM_KEYDOWN
虚拟键码VK_SHIFT(0x10)
WM_KEYUP
虚拟键码VK_SHIFT(0x10)
按下并释放A键消息表
消息
键或代码
WM_KEYDOWN
“A”的虚拟键码(0x41)
WM_CHAR
“a”的字符代码(0x61)
WM_KEYUP
“A”的虚拟键码(0x41)
按下Shift键同时按下大写A键,并同时释放的消息表
消息
键或代码
WM_KEYDOWN
虚拟键码VK_SHIFT(0x10)
WM_KEYDOWN
“A”的虚拟键码(0x41)
WM_CHAR
“A”的字符代码(0x41)
WM_KEYUP
“A”的虚拟键码(0x41)
WM_KEYUP
虚拟键码VK_SHIFT(0x10)
⒊KEYVIEW1程序
/*--------------------------------------------------------
KEYVIEW1.C--DisplaysKeyboardandCharacterMessages
(c)CharlesPetzold,1998
--------------------------------------------------------*/
#include
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
i