1、Windows Api教案5第五章 键 盘一 键盘基础 扫描码当每按下一个键或者释放一个键,键盘设备就产生一个扫描码,这些扫描码可以唯一地确定相应的键。每个键可以产生两个不同的扫描码,当键按下时,产生的扫描码最高有效位为0,当键释放时,产生的扫描码最高有效位为1。譬如,Esc的扫描码为1,数字键1、2、3的扫描码为2、3、4等。 虚拟键盘为了提供与设备无关的键盘操作,Windows定义了一个虚拟键盘。虚拟键盘不但包括了目前键盘所用的标准键集,还定义了一些目前键盘上没有的虚拟键,以便将来进行适当的扩充。由Windows通过键盘驱动程序将各种不同的物理键盘映射到同一个虚拟键盘上,而应用程序只需处理
2、这唯一的虚拟键盘的输入即可。 虚拟键表下表列出了绝大多数Windows定义的虚拟键的键码,这些虚拟键均带有前缀VK_。虚拟键表十进制值十六进制值Windows中定义的标识符IBM PC键盘中相应的键是否必须101VK_LBUTTON鼠标左键否202VK_RBUTTON鼠标右键否303VK_CANCELCtrl-Break是404VK_MBUTTON鼠标中键否808VK_BACKBackspace是909VK_TABTab是120CVK_CLEARNum Lock关闭时数字键盘5否130DVK_RETURNEnter是1610VK_SHIFTShift是1711VK_CONTROLCtrl是18
3、12VK_MENUAlt是1913VK_PAUSEPause否2014VK_CAPTIALCaps Lock是271BVK_ESCAPEEsc是3220VK_SPACESpacebar是3321VK_PRIORPage Up是3422VK_NEXTPage Down 是3523VK_ENDEnd是3624VK_HOMEHome是3725VK_LEFTLeft Arrow是3826VK_UPUp Arrow是3927VK_RIGHTRight Arrow是4028VK_DOWNDown Arrow是4129VK_SELECT否422AVK_PRINT否432BVK_EXECUTE否442CVK_
4、SNAPSHOTPrint Screen否452DVK_INSERTInsert是462EVK_DELETEDelete是472FVK_HELP否48573039N/A主键盘上的09是6590415AN/AAZ是915BVK_LWIN左Windows键否925CVK_RWIN右Windows键否935DVK_APPSApplications键否961056069VK_NUMPAD0VK_NUMPAD9Num Lock打开时数字键盘上的09否1066AVK_MULTIPLY数字键盘上的*键否1076BVK_ADD数字键盘上的+键否1086CVK_SEPARATER否1096DVK_SUBTRAC
5、T数字键盘上的键否1106EVK_DECIMAL数字键盘上的键否1116FVK_DIVIDE数字键盘上的 / 键否1121217079VK_F1VK_F10功能键F1F10是1221357A87VK_F11VK_F24功能键F11F24否14490VK_NUMLOCKNum Lock否15591VK_SCROLLScroll Lock否二 键盘消息Windows中的键盘消息分为两大类,即击键消息和字符消息。对于键盘上的所有键,每次按下或者释放时,都会产生击键消息。但是,只有那些产生可显示字符或控制字符的键,才会产生字符消息。对于产生可显示字符或者控制字符的击键或击键组合,Widows不仅向应用
6、程序发送击键消息,而且还发送字符消息。对于不产生可显示字符或控制字符的键,系统只发送击键消息而不发送字符消息。 击键消息 分类WM_KEYDOWN、 WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP。在通常情况下,按下键和释放键消息是成对出现的。如果按住一个键不放达到一定时间,会激活系统自动重复功能,在这种情况下,当该键最终被释放的时候,系统会给相应的窗口过程发送一系列WM_KEYDOWN(或WM_SYSKEYDOWN)消息和一个WM_KEYUP(或WM_SYSKEYUP)消息。 系统击键消息该类型消息通常由含有Alt键的击键组合产生,用于快速激活菜单及菜单中的选项、切换当
7、前窗口和其他系统操作。这些消息通常由系统处理,应用程序通常忽略系统击键消息,而由窗口函数将这些消息交由系统默认处理函数DefWindowProc去处理。 击键消息参数参数wParam中是虚拟键代码,用于指定所按下或者释放的键。参数lParam包含了与击键消息相关的其他有用信息。LParam的32位共分为6个部分,见下图:313029242316150说明: 重复次数 重复次数表示该消息代表的击键次数。在通常情况下,重复次数的值为1。如果按住一个键不放,则系统将自动重复产生该键的击键消息WM_KEYDOWN(或WM_SYSKEYDOWN)。当Windows向消息队列里放置一条WM_KEYDOWN
8、消息(或WM_SYSKEYDOWN消息)时,如果在此之前已经存在相同的击键消息,则系统将相同的消息合并为一条,而将该击键消息的重复计数值加1。如果重复计数的值大于1,则表明击键的速度大于窗口函数处理键盘消息的速度,此时,窗口函数把WM_KEYDOWN消息看作重复消息。窗口函数可以根据需要忽略重复计数而将其视为一次击键,或者根据重复计数的值将其作为多次击键来处理。WM_KEYUP和WM_SYSKEYUP消息的重复计数始终为1。 OEM扫描码OEM扫描码由键盘硬件产生。 扩展键标志该标志仅一位,用来指示按下或释放的键是否为IBM扩展键盘上的键,这些键包括扩展键盘顶部的功能键、非数字键盘上的光标移动
9、键、Insert和Delete等特殊功能键、NumLock键、数字键盘上的“/”键和回车键,以及右Alt键和右Ctrl键等。如果是扩展键,在该位为1,否则为0。在通常情况下,应用程序忽略该标志位。 Alt键标志Alt键标志只有一位,用来指示该键是否与Alt键同时被按下。如果是,则该位为1,否则为0。 先前状态标志该标志也仅一位,用以标识键的先前状态。如果该键先前被按下,则该位为1,否则为0。 过渡状态标志如果键正被按下,则该位为0;如果键正被释放,则该位为1。 GetKeyState函数 SHORT GetKeyState( int iVirtKey / virtual-key code );
10、说明:其中,唯一的参数iVirtKey用于指定需要检查状态的键,该函数通过将返回的短整数的不同位设置为不同的值,来指示各种不同的按键情况。例如:nState=GetKeyState(VK_SHIFT); 这时可检查nState的最高位是否为1来判断Shift键的状态。 nState=GetKeyState(VK_CAPTIAL); 这时可检查nState的最低位是否为1来判断CapsLock键的状态。 GetAsyncKeyState函数 SHORT GetAsyncKeyState( int vKey / virtual-key code );说明:该函数与GetKeyState的返回值含义
11、是相同的。两者的不同之处在于,函数GetKeyState获取的是击键消息产生时指定键的状态,而函数GetAscyncKeyState获取的是执行该语句时指定键的当前状态。 字符消息对于那些产生可显示字符的操作,Windows还会向窗口函数发送字符消息。字符消息不是由硬件产生的,而是由击键消息转换而来的。即由消息循环代码完成的。while(GetMessage(&msg,NULL,0,0) TranslateMessage(&msg); DispatchMessage(&msg);TranslateMessage函数从WM_KEYDOWN或WM_SYSKEYDOWN击键消息中取得虚拟键码,如果相
12、应的击键操作产生可显示字符,则TranslateMessage把相应的字符消息放入消息队列中,在紧随其后的下一个消息循环中,该字符消息被取出并发往相应的窗口函数。 分类WM_CHAR、WM_DEADCHAR、WM_SYSCHAR、WM_SYSDEADCHAR。前两种由WM_KEYDOWN转换而来,后两种由WM_SYSKEYDOWN转换而来。在某些非英语的键盘上,有些键用于给字母加音标。由于它们本身并不产生字符,所以称为“死键”。一般不处理。 参数字符消息的lParam参数与相应的击键消息的lParam参数意义相同,但wParam参数不再是虚拟键码,而是字符代码。例如:按下并释放Shift键消息
13、表消 息键 或 代 码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 - Displays Keyboard and Character Messages (c) Charles Petzold, 1998 -*/#include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;i
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1