关于键盘(四处拼凑转载而来)

一、键盘消息

      键盘动作能够触发的消息主要有WM_KEYDOWN、WM_SYSKEYDOWN、WM_SYSKEYUP、WM_KEYUP、WM_CHAR、WM_SYSCHAR、WM_DEADCHAR、WMSYSDEADCHAR。
      键盘消息的两个参数wParam和lParam都用来传递有关击键某些信息。其中wParam消息参数用于传递表示键盘某个被按下键的信息;而lParam消息则用于传递某些诸如连续击键次数、按下键的OEM扫描码等等的附加信息。
二、何时触发消息
      对于任何键盘上的键按下和释放都会先后触发WM_KEYDOWN和WM_KEYUP消息。在这两个消息的wParam参数中储存的是按下键的 虚拟码,例如Ctrl键储存的是VK_CONTROL 虚拟码等等。
      当按下的是键盘上的字母或者数值等这些能够表达为一个打印字符的消息时,操作系统将在发送WM_KEYDOWN和WM_KEYUP的中间发送一个WM_CHAR消息,这个消息的wParam参数中是一个按下键所对应的字符在字符集中的代码,通过TCHAR类型转换就可以转换成一个字符供程序使用。当然这里存在一个非ASCII码字符的国际化问题,这将在本文的后面专门讲述。
三、主要键盘消息使用的详解
1.WM_CHAR
       毫无疑问这是所有键盘消息中最常用最重要的消息。但是使用这个消息也相对是最简单的,因为操作系统已经为我们做完了所有的一切,我们只需要用TCHAR的转换把字符集代码转换为字符即可使用。当然即使是类似西欧字符中那种有重音符号的字符操作系统也会通过处理死键消息来替我们做完一切事情。
2.WM_KEYDOWN
      这个消息是我们获取非打印字符的一个重要消息。这个消息中的wParam参数储存了按键的虚拟代码,之所以是虚拟代码是为了实现真正的与硬件无关化。
      那么那些能够用转义字符表示的非打印字符是否也应该用这个消息来获取呢?答案是否定的,比如说enter、spacebar、backspace这些键我们最好还是用WM_CHAR来或取。我们用WM_KEYDOWN来响应的消息应该是VK_KEYUP等等这些根本无法用转义字符表示的按键。
3.WM_DEADKEY
      何为死键,死键就是在处理西欧字符中那些有重音符号的字母之前必须按的一个键,只有在按了这个键并且在这之后再按一个字母键才会在相应的字母上显示一个重音符号。
四、WM_CHAR消息的内幕
      在触发WM_CHAR消息之前,操作系统处理WM_KEYDOWN消息并确定这个WM_KEYDOWN消息中的wParam参数中储存的是一个打印字符的虚拟码。这样操作系统就把这个虚拟码提取出来并把它转换成一个字符集代码,并把他储存在重新触发的WM_CHAR消息的wParam中。之后就发出WM_CHAR消息。
       所有的一切在ASCII码中工作的都是非常完美,但是当遇到非ASCII码字符时就要依赖于字符集了。因为在非UNICODE状况下字符集中只有代表ASCII码之后的位置中放了数量有限的其他字符。这时中文版的windows和法语版的windows中的字符集就不同了。当你在中文版的操作系统中输入使用法语的键盘布局输入一个法语字母时就会出现奇怪的现象,因为两个不同字符集中的不同字符可能拥有相同的字符集代码,这时即使键盘消息标示了一个正确的字符集代码也会出现问题。然而在UNICODE状况下就不同了,因为UNICODE字符集用一个完整的字符集来包括了世界上所有字符的代码,任何字符都有一个确切的代码所以不会有任何的歧异产生。
五、使用光标
      在响应键盘事件的同时我们有时候会用到光标,在程序设计里这叫做插入符而不是光标。
创键插入符使用函数CreateCaret(HWND,HBITIMAGE,int Width,int Height);创建插入符之后必须使用ShowCaret(HWND)函数才会显示插入符。同时我们能够获取和设置插入符的位置使用函数GetCaretPos和SetCaretPos。另外在非WM_PAINT消息的消息中绘图时我们必须首先使用HideCaret(HWND)来隐藏插入符。
      一个程序中只允许一个窗口拥有插入符,从逻辑上讲也只允许程序中拥有焦点的那个窗口出现插入符。所以我们应该在窗口过程的WM_SETFOCUS消息中创建插入符,而在WM_KILLFOCUS消息中使用DestroyCaret(HWND)函数删除插入符。
附:很全的虚拟键码表
虚拟键码对应值(十进制) 对应键
VK_LBUTTON1鼠标左键
VK_RBUTTON2鼠标右键
VK_CANCEL3Cancel
VK_MBUTTON4鼠标中键
VK_XBUTTON15 
VK_XBUTTON26 
VK_BACK8Backspace
VK_TAB9Tab
VK_CLEAR12Clear
VK_RETURN13Enter
VK_SHIFT16Shift
VK_CONTROL17Ctrl
VK_MENU18Alt
VK_PAUSE19Pause
VK_CAPITAL20Caps Lock
VK_KANA21 
VK_HANGUL21 
VK_JUNJA23 
VK_FINAL24 
VK_HANJA25 
VK_KANJI25* 
VK_ESCAPE27Esc
VK_CONVERT28 
VK_NONCONVERT29 
VK_ACCEPT30 
VK_MODECHANGE31 
VK_SPACE32Space
VK_PRIOR33Page Up
VK_NEXT34Page Down
VK_END35End
VK_HOME36Home
VK_LEFT37Left Arrow
VK_UP38Up Arrow
VK_RIGHT39Right Arrow
VK_DOWN40Down Arrow
VK_SELECT41Select
VK_PRINT42Print
VK_EXECUTE43Execute
VK_SNAPSHOT44Snapshot
VK_INSERT45Insert
VK_DELETE46Delete
VK_HELP47Help
 480
 491
 502
 513
 524
 535
 546
 557
 568
 579
 65A
 66B
 67C
 68D
 69E
 70F
 71G
 72H
 73I
 74J
 75K
 76L
 77M
 78N
 79O
 80P
 81Q
 82R
 83S
 84T
 85U
 86V
 87W
 88X
 89Y
 90Z
VK_LWIN91 
VK_RWIN92 
VK_APPS93 
VK_SLEEP95 
VK_NUMPAD096小键盘 0
VK_NUMPAD197小键盘 1
VK_NUMPAD298小键盘 2
VK_NUMPAD399小键盘 3
VK_NUMPAD4100小键盘 4
VK_NUMPAD5101小键盘 5
VK_NUMPAD6102小键盘 6
VK_NUMPAD7103小键盘 7
VK_NUMPAD8104小键盘 8
VK_NUMPAD9105小键盘 9
VK_MULTIPLY106小键盘 *
VK_ADD107小键盘 +
VK_SEPARATOR108小键盘 Enter
VK_SUBTRACT109小键盘 -
VK_DECIMAL110小键盘 .
VK_DIVIDE111小键盘 /
VK_F1112F1
VK_F2113F2
VK_F3114F3
VK_F4115F4
VK_F5116F5
VK_F6117F6
VK_F7118F7
VK_F8119F8
VK_F9120F9
VK_F10121F10
VK_F11122F11
VK_F12123F12
VK_F13124 
VK_F14125 
VK_F15126 
VK_F16127 
VK_F17128 
VK_F18129 
VK_F19130 
VK_F20131 
VK_F21132 
VK_F22133 
VK_F23134 
VK_F24135 
VK_NUMLOCK144Num Lock
VK_SCROLL145Scroll
VK_LSHIFT160 
VK_RSHIFT161 
VK_LCONTROL162 
VK_RCONTROL163 
VK_LMENU164 
VK_RMENU165 
VK_BROWSER_BACK166 
VK_BROWSER_FORWARD167 
VK_BROWSER_REFRESH168 
VK_BROWSER_STOP169 
VK_BROWSER_SEARCH170 
VK_BROWSER_FAVORITES171 
VK_BROWSER_HOME172 
VK_VOLUME_MUTE173VolumeMute
VK_VOLUME_DOWN174VolumeDown
VK_VOLUME_UP175VolumeUp
VK_MEDIA_NEXT_TRACK176 
VK_MEDIA_PREV_TRACK177 
VK_MEDIA_STOP178 
VK_MEDIA_PLAY_PAUSE179 
VK_LAUNCH_MAIL180 
VK_LAUNCH_MEDIA_SELECT181 
VK_LAUNCH_APP1182 
VK_LAUNCH_APP2183 
VK_OEM_1186; :
VK_OEM_PLUS187= +
VK_OEM_COMMA188 
VK_OEM_MINUS189- _
VK_OEM_PERIOD190 
VK_OEM_2191/ ?
VK_OEM_3192` ~
VK_OEM_4219[ {
VK_OEM_5220/ |
VK_OEM_6221] }
VK_OEM_7222' "
VK_OEM_8223 
VK_OEM_102226 
VK_PACKET231 
VK_PROCESSKEY229 
VK_ATTN246 
VK_CRSEL247 
VK_EXSEL248 
VK_EREOF249 
VK_PLAY250 
VK_ZOOM251 
VK_NONAME252 
VK_PA1253 
VK_OEM_CLEAR254 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值