VC 键盘消息键值
GetAsyncKeyState和GetKeyState

键盘消息常用获取按键状态的两大函数为GetAsyncKeyState和GetKeyState。
使用GetKeyState()返回一个short型的数,short型是16位有符号的数据类型,如果要查询的键被按下,返回值最高位被置1,则这个数表示负数,所以可以用<0或>0来判断。
另一方面 0x8000是16进制数,用2进制表示为1000 0000 0000 0000,&是按位与,同样,如果键被按下,返回值最高位为1,则1xxx xxxx xxxx xxxx & 1000 0000 0000 0000得到的结果为1,否则为0,同样可以判断最高位的值。
两者的区别:1、GetKeyState()只能在键盘消息处理程序中使用,因为它只有在线程从消息队列中读取键盘消息时才会报告被查询键的状态,如果需要在键盘消息处理程序以外查询按键状态,则需要使用::GetAsyncKeyState来代替。
2、函数GetKeyState与GetAsyncKeyState函数不同。
GetAsyncKeyState在按下某键的同时调用,判断正在按下某键。
GetKeyState则在按过某键之后再调用,它返回最近的键盘消息从线程的队列中移出时的键盘状态,判断刚按过了某键。
例1使用后发现两者的区别(以组合键CTRL+A为例):if (nChar ==0x041)&& (GetKeyState(VK_CONTROL)&0x8000) //ctrl+A{//执行相应的操作}的效果是按下CTRL和A,实现指定的操作;(只有先按下CTRL然后按A或者同时按下二者,才能执行指定的操作)而如果用if (nChar ==0x041)&& GetAsyncKeyState(VK_CONTROL)) //ctrl+A{//执行相应的操作}得到的效果将是:按下CTRL,然后按下A,可以执行指定的操作,但是与上述的区别在于:按下CTRL后隔了一段时间(可能是几秒或更长时间),然后再回过来按A键也会执行指定的操作(这样不是期望的效果)。
C#键盘KeyCode与keyValue

C#键盘KeyCode与keyValue在C#中,经常⽤到键盘事件,⽤到键盘事件时,就需要知道键的KeyCode(键),或者是keyValue(键值)。
如:Enter的键盘事件,KeyCode = Enter,keyValue = 13private void Key_down(object sender, KeyEventArgs e){ if (e.KeyValue == 13) // if(e.KeyCode == Keys.Enter) { MessageBox.Show("13"); }}⼜如:Aprivate void Key_down(object sender, KeyEventArgs e){ if (e.KeyValue == 65) // if(e.KeyCode == Keys.A) { MessageBox.Show("A"); }}字母和数字键的键码值(keyCode)按键键码按键键码按键键码按键键码A65J74S83149B66K75T84250C67L76U85351D68M77V86452E69N78W87553F70O79X88654G71P80Y89755H72Q81Z90856I73R82048957数字键盘上的键的键码值(keyCode)功能键键码值(keyCode)按键键码按键键码按键键码按键键码0968104F1112F71181979105F2113F8119298*106F3114F9120399+107F4115F101214100Enter108F5116F111225101-109F6117F121236102.1107103/111控制键键码值(keyCode)按键键码按键键码按键键码按键键码BackSpace8Esc27Right Arrow39-_189 Tab9Spacebar32Dw Arrow40.>190 Clear12Page Up33Insert45/?191 Enter13Page Down34Delete46`~192 Shift16End35Num Lock144[{219 Control17Home36;:186/|220 Alt18Left Arrow37=+187]}221 Cape Lock20Up Arrow38,<</TD>188'"222多媒体键码值(keyCode)按键键码按键键码按键键码按键键码⾳量加175⾳量减174停⽌179静⾳173浏览器172邮件180搜索170收藏171//C#中e.Handle是取消事件,将 Handled 设置为 true,以取消 KeyPress 事件只要程序运⾏到 e.Handle=true; 就退出。
vc启动软键盘

通过按钮打开windows的软键盘1.直接运行微软系统自带的虚拟键盘程序“osk.exe”在普通MFC项目中可以调用ShellExecute或者WinExec方法来直接运行微软系统自带的虚拟键盘程序“osk.exe”,十分方便一句话就可以搞定。
ShellExecute:ShellExecute(GetSafeHwnd(), NULL, _T("osk.exe"), NULL, NULL,SW_NO RMAL);WinExec:WinExec("osk.exe",SW_NORMAL);程序运行出来的界面:2.添加"imm.h"和"imm32.lib"来调出软键盘在你要调出软键盘的代码中引入"imm.h"头文件(若项目里没有这两个文件,则将这两文件复制到项目根目录里,并将"imm.h"添加到工程里)#include <Imm.h>#pragma comment(lib,"imm32.lib")然后在调出软键盘的消息事件中添加如下代码即可:HIMC hIMC = ImmGetContext(pWnd->m_hWnd); //获取接受输入的窗口句柄DWORD dwConv, dwSent;ImmGetConversionStatus(hIMC,&dwConv,&dwSent);if (dwConv & IME_CMODE_SOFTKBD)dwConv &= ~IME_CMODE_SOFTKBD;//关闭软键盘elsedwConv |= IME_CMODE_SOFTKBD; //打开软键盘ImmSetConversionStatus(hIMC,dwConv,dwSent); //打开或关闭软键盘ImmReleaseContext(pWnd->m_hWnd,hIMC);但这种方法似乎只能在输入法开启的状态下才可以打开软键盘3.在WINCE上运行的MFC中使用SipApi来调出软键盘为项目添加"sipapi.h"头文件,并在代码中把这个头文件包括进来调出软键盘的方法调用起来很简单,就一句话而已。
详细的键盘键值表

详细的键盘键值表详细的键值表:常数名称⼗六进制值⼗进制值对应按键VK_LBUTTON011⿏标的左键VK_RBUTTON022⿏标的右键VK-CANCEL033Ctrl+Break(通常不需要处理)VK_MBUTTON044⿏标的中键(三按键⿏标)VK_BACK088Backspace键VK_TAB099Tab键VK_CLEAR0C12Clear键(Num Lock关闭时的数字键盘5)VK_RETURN0D13Enter键VK_SHIFT1016Shift键VK_CONTROL1117Ctrl键VK_MENU1218Alt键VK_PAUSE1319Pause键VK_CAPITAL1420Caps Lock键VK_ESCAPE1B27Ese键VK_SPACE2032Spacebar键VK_PRIOR2133Page Up键VK_NEXT2234Page Domw键VK_END2335End键VK_HOME2436Home键VK_LEFT2537LEFT ARROW 键(←)VK_UP2638UP ARROW键(↑)VK_RIGHT2739RIGHT ARROW键(→)VK_DOWN2840DOWN ARROW键(↓)VK_Select2941Select键VK_PRINT2A42VK_EXECUTE2B43EXECUTE键VK_SNAPSHOT2C44Print Screen键(抓屏)VK_Insert2D45Ins键(Num Lock关闭时的数字键盘0)VK_Delete2E46Del键(Num Lock关闭时的数字键盘.)VK_HELP2F47Help键VK_030480键VK_131491键VK_232502键VK_333513键VK_434524键VK_535535键VK_636546键VK_737557键VK_838568键VK_939579键VK_A4165A键VK_B4266B键VK_C4367C键VK_D4468D键VK_E4569E键VK_F4670F键VK_G4771G键VK_H4872H键VK_I4973I键VK_J4A74J键VK_K4B75K键VK_L4C76L键VK_M4D77M键VK_N4E78N键VK_O4F79O键VK_P5080P键VK_Q5181Q键VK_R5282R键VK_S5383S键VK_T5484T键VK_U5585U键VK_V5686V键VK_W5787W键VK_X5888X键VK_Y5989Y键VK_Z5A90Z键VK_NUMPAD06096数字键0键VK_NUMPAD16197数字键1键VK_NUMPAD26298数字键2键VK_NUMPAD36299数字键3键VK_NUMPAD464100数字键4键VK_NUMPAD565101数字键5键VK_NUMPAD666102数字键6键VK_NUMPAD666102数字键6键VK_NUMPAD767103数字键7键VK_NUMPAD868104数字键8键VK_NUMPAD969105数字键9键VK_MULTIPLY6A106数字键盘上的*键VK_ADD6B107数字键盘上的+键VK_SEPARATOR6C108Separator键VK_SUBTRACT6D109数字键盘上的-键VK_DECIMAL6E110数字键盘上的.键VK_DIVIDE6F111数字键盘上的/键VK_F170112F1键VK_F271113F2键VK_F372114F3键VK_F473115F4键VK_F574116F5键VK_F675117F6键VK_F776118F7键VK_F877119F8键VK_F978120F9键VK_F1079121F10键VK_F117A122F11键VK_F127B123F12键VK_NUMLOCK90144Num Lock 键VK_SCROLL91145Scroll Lock键上⾯没有提到的:(都在⼤键盘)VK_LWIN91左win键VK_RWIN92右win键VK_APPS93右Ctrl左边键,点击相当于点击⿏标右键,会弹出快捷菜单186;(分号)187=键188,键(逗号)189-键(减号)190.键(句号)191/键192`键(Esc下⾯)219[键220键221]键222‘键(引号)delphi虚拟键码对应关键VK_LBUTTON⿏标左键VK_RBUTTON⿏标右键VK_CANCEL控制+休息VK_MBUTTON⿏标中键VK_BACK Backspace键VK_TAB Tab键VK_CLEAR清除主要VK_RETURN Enter键VK_SHIFT Shift键VK_CONTROL Ctrl键VK_MENU Alt键VK_PAUSE暂停关键VK_CAPITAL Caps Lock键VK_KANA可与输⼊法VK_HANGUL可与输⼊法VK_JUNJA可与输⼊法VK_FINAL可与输⼊法VK_HANJA可与输⼊法VK_KANJI可与输⼊法VK_CONVERT可与输⼊法VK_NONCONVERT可与输⼊法VK_ACCEPT可与输⼊法VK_MODECHANGE可与输⼊法VK_ESCAPE Esc键VK_SPACE空间酒吧VK_PRIOR页键VK_NEXT下⼀页关键VK_END END键VK_HOME主页关键VK_LEFT左箭头键VK_UP向上键VK_RIGHT右箭头键VK_DOWN下箭头键VK_SELECT选择关键VK_PRINT打印键(键盘的具体)VK_EXECUTE执⾏关键VK_SNAPSHOT Print Screen键VK_INSERT插⼊关键VK_DELETE Delete键VK_HELP帮助关键VK_LWIN左Windows键(微软键盘)VK_RWIN右Windows键(微软键盘)VK_APPS应⽤关键(微软键盘)VK_NUMPAD0 0键(数字键盘)VK_NUMPAD1 1键(数字键盘)VK_NUMPAD2 2键(数字键盘)VK_NUMPAD3 3键(数字键盘)VK_NUMPAD4 4键(数字键盘)VK_NUMPAD5 5键(数字键盘)VK_NUMPAD6 6键(数字键盘)VK_NUMPAD7 7键(数字键盘)VK_NUMPAD8 8键(数字键盘)VK_NUMPAD9 9键(数字键盘)VK_MULTIPLY多键(数字键盘)VK_ADD添加键(数字键盘)VK_SEPARATOR分离键(数字键盘)VK_SUBTRACT减去键(数字键盘)VK_DECIMAL⼩数点键(数字键盘)VK_DIVIDE鸿沟键(数字键盘)VK_F1 F1键VK_F5 F5键VK_F6 F6键VK_F7 F7键VK_F8 F8键VK_F9 F9键VK_F10 F10键关键VK_F11 F11键VK_F12 F12键VK_F13 F13键VK_F14 F14键VK_F15 F15键VK_F16 F16键VK_F17 F17键VK_F18 F18键VK_F19 F19键VK_F20 F20键VK_F21 F21键VK_F22 F22键VK_F23 F23键VK_F24 F24键VK_NUMLOCK数Lock键VK_SCROLL滚动Lock键VK_LSHIFT左Shift键(仅⽤于GetAsyncKeyState和GetKeyState )VK_RSHIFT右Shift键(仅⽤于GetAsyncKeyState和GetKeyState )VK_LCONTROL左Ctrl键(仅⽤于GetAsyncKeyState和GetKeyState )VK_RCONTROL右Ctrl键(仅⽤于GetAsyncKeyState和GetKeyState )VK_LMENU左Alt键(仅⽤于GetAsyncKeyState和GetKeyState )VK_RMENU右Alt键(仅⽤于GetAsyncKeyState和GetKeyState )VK_PROCESSKEY⼯艺关键VK_ATTN经办关键VK_CRSEL CrSel关键VK_EXSEL ExSel关键VK_EREOF擦除EOF分析关键VK_PLAY发挥关键VK_ZOOM变焦关键VK_NONAME保留以供将来使⽤VK_PA1 PA1关键VK_OEM_CLEAR清除主要标签数: 1 “ F14键VK_F18 F18键VK_F19 F19键VK_F20 F20键VK_F21 F21键VK_F22 F22键VK_F23 F23键VK_F24 F24键VK_NUMLOCK数Lock键VK_SCROLL滚动Lock键VK_LSHIFT左Shift键(仅⽤于GetAsyncKeyState和GetKeyState )VK_RSHIFT右Shift键(仅⽤于GetAsyncKeyState和GetKeyState )VK_LCONTROL左Ctrl键(仅⽤于GetAsyncKeyState和GetKeyState )VK_RCONTROL右Ctrl键(仅⽤于GetAsyncKeyState和GetKeyState )VK_LMENU左Alt键(仅⽤于GetAsyncKeyState和GetKeyState )VK_RMENU右Alt键(仅⽤于GetAsyncKeyState和GetKeyState )VK_PROCESSKEY⼯艺关键VK_ATTN经办关键VK_CRSEL CrSel关键VK_EXSEL ExSel关键VK_EREOF擦除EOF分析关键VK_PLAY发挥关键VK_ZOOM变焦关键VK_NONAME保留以供将来使⽤VK_PA1 PA1关键VK_OEM_CLEAR清除主要。
了解VC++消息映射与命令通知

了解VC++消息映射与命令通知作者:未知文章来源:网络站长评论:本问是一篇不错的VC开发技术入门文章通过这篇文章您应该可以对WINDOWS编程中的消息有一定的了解!消息映射消息的传递与发送是Windows应用程序的核心所在,任何事件的触发与响应均要通过消息的作用才能得以完成。
在SDK编程中,对消息的获取与分发主要是通过消息循环来完成的,而在MFC编程中则是通过采取消息映射的方式对其进行处理的。
相比而言,这样的处理方式要简单许多,这也是符合面向对象编程中尽可能隐含实现细节的原则。
一个完整的MFC消息映射包括对消息处理函数的原型声明、实现以及存在于消息映射中的消息入口。
这几部分分别存在与类的头文件和实现文件中。
一般情况下除了对自定义消息的响应外,对于标准Windows 消息的映射处理可以借助ClassWizard向导来完成。
在选定了待处理的Windows 消息后,向导将会根据消息的不同而生成具有相应函数参数和返回值的消息处理代码框架。
下面这段代码给出了一个完成的MFC消息映射过程:// 在.h文件中的声明//{{AFX_MSG(CMessageMapView)afx_msg void OnMove(int x, int y);//}}AFX_MSGDECLARE_MESSAGE_MAP()……// 在.cpp文件中的实现BEGIN_MESSAGE_MAP(CMessageMapView, CView)//{{AFX_MSG_MAP(CMessageMapView)ON_WM_MOVE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()……void CMessageMapView::OnMove(int x, int y){CView::OnMove(x, y);// TODO: Add your message handler code here}这里对Windows标准消息WM_MOVE做了消息映射,其中用到的BEGIN_MESSAGE_MAP、END_MESSAGE_MAP和头文件中的DECLARE_MESSAGE_MAP等均是用于消息映射的宏。
VC 向其他程序发送按键消息

VC如何模拟按键并释放?模拟按键:利用PostMessage函数发送按键消息.HWND hWnd;hWnd = ::FindWindow(NULL, "指定的窗口标题");//得到目标窗口句柄if ( hWnd == NULL ){AfxMessageBox("没有找到目标程序");}else{::PostMessage(hWnd, WM_KEYDOWN, VK_F1, 1);::PostMessage(hWnd,WM_KEYUP, VK_F1, 1); //释放}或者:HWND hWnd;hWnd = ::FindWindow(NULL, "计算器");//找到目标窗口的hWndif ( hWnd != NULL ){::PostMessage(hWnd, WM_KEYDOWN, VK_F1, 1);::PostMessage(hWnd,WM_KEYUP, VK_F1, 1); //释放}求一个用vc写的发送按键消息的例程悬赏分:200 - 解决时间:2008-9-27 13:39比如向最小化的记事本打一个“a”进去。
看清楚哦,要那种最小化也可以的哦。
我要完整的代码,要直接复制到vc6.0里就能运行的。
对高手来说应该不难吧~~~~谢咯问题补充:鄙视粘贴复制流~~~~~谢三楼哈~~~~~~~你能稍微解释一下吗??为什么要加一句HWND hWndc = ::GetWindow(hWnd,GW_CHILD);我小菜,不太懂~~~最佳答案检举#include <windows.h>void main(){HWND hWnd = ::FindWindowW(L"Notepad",NULL); //搜索记事本程序主窗口句柄HWND hWndc = ::GetWindow(hWnd,GW_CHILD); //获得记事本客户区句柄(该窗口是记事本主窗口的子窗口,即那个白色的可编辑区域)if(hWndc) //如果获得了该句柄::SendMessage(hWndc,WM_CHAR,'A',NULL);//发送按键消息}这个例子就是实现向最小化的记事本打一个“A”进去。
vk_键值

VK_DOWN 表示键盘上 “向下箭头”键。
VK_INSERT 表示键盘上 “ INSTERT ”键。
VK_MULTIPLY 表示键盘上 “ * ”键。
VK_NUMPAD0 到 VK_NUMPAD9 表示数字键盘上 “ 0 ”到“ 9 ”键。 VK_OPEN_BRACKET 表示键盘上 “ [ ”键。
VK_PAGE_DOWN 表示键盘上 “ PAGE DOWN ”键。
VK_NUMPAD0 到 VK_NUMPAD9 表示键盘上数字“ 0 ”到“ 9 ”键 (ASCII 码为 0x30 - 0x39)或(0x60-0x69) ;
VK_A 到 VK_Z 表示键盘上字母“ A ”到“ Z ”键 (ASCII 码为 0x41 - 0x5a) 或(0x41-0x5a);
VK_END 表示键盘上 “ END ”键。
VK_ENTER 表示键盘上 “ ENTER ”键。
VK_EQUALS 表示键盘上 “=”键。
VK_ESCAPE 表示键盘上 “ ESC ”键。
VK_F1 到 VK_F12 表示键盘上 “ F1 ”到“ F12 ”键。
VK_HOME 表示键盘上 “ HOME ”键。
VK_CLOSE_BRACKET 表示键盘上 “ ] ”键。
VK_COMMA 表示键盘上 “ , ”键。
VK_CONTROL 表示键盘上 “ CTRL ”键。
VK_DECIMAL 表示数字键盘上 “ . ”键。
VK_DELETE 表示键盘上 “ DELETE ”键。
VK_DIVIDE 表示键盘上 “ / Nhomakorabea”键。
VK_ADD 表示数字键盘上的“ + ”键。
键盘键值对应的值

键盘键值对应的值【原创版】目录1.键盘键值对应值的概念和重要性2.键盘键值对应值的种类3.键盘键值对应值的应用4.键盘键值对应值的发展趋势正文1.键盘键值对应值的概念和重要性在计算机技术高速发展的今天,键盘作为人机交互的主要设备之一,其重要性不言而喻。
而键盘键值对应的值,就是指计算机在接收到键盘输入时,将输入的键值转换成相应的数值或字符的过程。
这一过程对于计算机处理和识别用户输入的信息具有重要意义。
2.键盘键值对应值的种类键盘键值对应值主要分为以下几类:(1)数字键值:数字键盘上的 0-9,分别对应 0-9 的数值。
(2)字母键值:26 个英文字母 A-Z,分别对应字母 A-Z 的数值。
(3)功能键值:包括方向键、功能键等,对应相应的功能操作。
(4)特殊键值:如回车键、空格键等,对应相应的特殊功能。
3.键盘键值对应值的应用键盘键值对应值在现实生活中的应用十分广泛,主要包括:(1)文本输入:用户通过键盘输入文字、数字等信息,计算机将其转换为相应的键值,以便进行处理和显示。
(2)游戏操作:在游戏中,键盘键值对应值可以实现对游戏角色的移动、攻击等操作,提高游戏的可玩性。
(3)编程开发:程序员通过键盘输入代码,计算机将代码转换为相应的键值,以便进行编译和运行。
4.键盘键值对应值的发展趋势随着科技的发展,键盘键值对应值也在不断发展和创新,主要体现在以下几个方面:(1)触摸屏技术的应用:触摸屏技术的发展,使得键盘不再是人机交互的唯一设备,用户可以通过触摸屏直接操作计算机。
(2)语音识别技术的发展:语音识别技术的逐渐成熟,使得用户可以通过语音直接输入信息,无需通过键盘输入。
(3)人工智能的融合:人工智能技术的发展,使得计算机可以更好地理解用户的输入意图,提高人机交互的智能化水平。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC 键盘消息键值
VC 中用KeyPress 表示键盘响应的所有事件,包括OnKeyDown 事件(键按下)、OnKeyUp 事件(键按下后弹起)和OnKeyPress 事件(按了某个键)。
OnKeyuUp 事件的语法为void Object1:: OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags );
OnKeyDown 事件的语法为void Object1:: OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );
这里参数nChar 代表的是键盘上各键的代码,是编写程序时必须要写明的,而参数nRepCnt, 和nFlags 则可以使用默认值而不必编写。
下面说明VC 的KeyPress 事件中的nChar 代码与键盘中各键的对应关系:
VK_0 到VK_9 表示键盘上数字“ 0 ”到“ 9 ”键(ASCII 码为0x30 - 0x39) ;
VK_A 到VK_Z 表示键盘上字母“ A ”到“ Z ”键(ASCII 码为0x41 - 0x5a) ;
VK_ADD 表示数字键盘上的“ + ”键。
VK_ALT 表示键盘上“ ALT ”键。
VK_BACK_QUOTE 表示键盘上“ ` ”键。
VK_BACK_SLASH 表示键盘上“ \ ”键。
VK_BACK_SPACE 表示键盘上“ BACKSPACE “键。
VK_CAPS_LOCK 表示键盘上“ CAPS LOCK ”键。
VK_CLOSE_BRACKET 表示键盘上“ ] ”键。
VK_COMMA 表示键盘上“ , ”键。
VK_CONTROL 表示键盘上“ CTRL ”键。
VK_DECIMAL 表示数字键盘上“ . ”键。
VK_DELETE 表示键盘上“ DELETE ”键。
VK_DIVIDE 表示键盘上“ / ”键。
VK_DOWN 表示键盘上“向下箭头”键。
VK_END 表示键盘上“ END ”键。
VK_ENTER 表示键盘上“ ENTER ”键。
VK_EQUALS 表示键盘上“=”键。
VK_ESCAPE 表示键盘上“ ESC ”键。
VK_F1 到VK_F12 表示键盘上“ F1 ”到“ F12 ”键。
VK_HOME 表示键盘上“ HOME ”键。
VK_INSERT 表示键盘上“ INSTERT ”键。
VK_LEFT 表示键盘上“向左箭头”键。
VK_MULTIPLY 表示键盘上“ * ”键。
VK_NUMPAD0 到VK_NUMPAD9 表示数字键盘上“ 0 ”到“ 9 ”键。
VK_OPEN_BRACKET 表示键盘上“ [ ”键。
VK_PAGE_DOWN 表示键盘上“ PAGE DOWN ”键。
VK_PAGE_UP 表示键盘上“ PAGE UP ”键。
VK_PAUSE 表示键盘上“ PAUSE ”键。
VK_PRINTSCREEN 表示键盘上“ PRINT SCREEN ”键。
VK_RIGHT 表示键盘上“向右箭头”键。
VK_SCROLL_LOCK 表示键盘上“ SCROLL LOCK ”键。
VK_SEMICOLON 表示键盘上“;”键。
VK_SHIFT 表示键盘上“ SHIFT ”键。
VK_SPACE 表示键盘上“ SPACEBAR ”键。
VK_SUBTRACT 表示键盘上“-”键。
VK_TAB 表示键盘上“ TAB ”键。
VK_UP 表示键盘上“向上箭头”键。