VC MFC 键盘消息的截取与响应
- 格式:rtf
- 大小:25.81 KB
- 文档页数:6
VC中WM_CLOSE、WM_DESTROY、WM_QUIT消息出现顺序及调用方式wxleasyland@2012.7wxleasyland试验:一、VC建的标准WIN32-HELLO WORLD程序中,case WM_DESTROY://PostQuitMessage(0);将这行屏蔽则,点关闭,窗口关闭了,但是程序进程还在!要在任务管理器中中止。
二、VC建的标准WIN32-HELLO WORLD程序中,1. 在WndProc()中加上case WM_CLOSE:WinExec("cmd /k echo WM_CLOSE: ",SW_SHOW);break;2. 按右上角的X、点图标\关闭、或者按ALT+F4,都只出现cmd窗,不会关闭程序。
因为原来是执行default: return DefWindowProc(hWnd, message, wParam, lParam); 即DefWindowProc来处理WM_CLOSE消息。
现在被case WM_CLOSE:拦截了。
3. 点菜单里的FILE\EXIT,则就是执行case WM_COMMAND: 里的case IDM_EXIT:DestroyWindow(hWnd); 了。
不会执行case WM_CLOSE:!!!DestroyWindow(hWnd); 会销毁窗口,同时发送WM_DESTROY消息直接让WndProc()处理(不经过消息队列)。
三、VC建的标准WIN32-HELLO WORLD程序中,1. 在WndProc()中加上case WM_CLOSE:WinExec("cmd /k echo WM_CLOSE: ",SW_SHOW);return DefWindowProc(hWnd, message, wParam, lParam);break;case WM_DESTROY:WinExec("cmd /k echo WM_DESTROY: ",SW_SHOW);PostQuitMessage(0);break;2. 按右上角的X、点图标\关闭、或者按ALT+F4,会先出现WM_CLOSE,再出现WM_DESTROY。
一走进Visual C++Visual C++作为一个功能非常强大的可视化应用程序开发工具,是计算机界公认的最优秀的应用开发工具之一。
Microsoft的基本类库MFC使得开发Windows应用程序比以往任何时候都要容易。
本光盘教学软件的目的就是为了让你学会在Visual C++环境下,利用微软的基本类库MFC开发出功能强大的Windows应用程序。
在本章节的内容当中,我们将向您介绍使用VC开发软件需要用到的一些基本概念,使用MFC进行编程的基本特点,以及VISUAL C++集成开发环境提供的一系列编程辅助工具——WIZARD的使用方法。
1 理解VC工程Visual C++作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。
在使用Visual C++开发应用程序的过程中,系统为我们生成了大量的各种类型的文件,在本节中将要详细介绍Visual C++中这些不同类型的文件分别起到什么样的作用,在此基础上对Visual C++如何管理应用程序所用到的各种文件有一个全面的认识。
首先要介绍的是扩展名为dsw的文件类型,这种类型的文件在VC中是级别最高的,称为Workspace文件。
在VC中,应用程序是以Project的形式存在的,Project文件以.dsp扩展名,在Workspace文件中可以包含多个Project,由Workspace文件对它们进行统一的协调和管理。
与dsw类型的Workspace文件相配合的一个重要的文件类型是以opt为扩展名的文件,这个文件中包含的是在Workspace文件中要用到的本地计算机的有关配置信息,所以这个文件不能在不同的计算机上共享,当我们打开一个Workspace文件时,如果系统找不到需要的opt类型文件,就会自动地创建一个与之配合的包含本地计算机信息的opt文件。
上面提到Project文件的扩展名是dsp,这个文件中存放的是一个特定的工程,也就是特定的应用程序的有关信息,每个工程都对应有一个dsp类型的文件。
MFC自定义控件编写过程MFC(Microsoft Foundation Class)是微软公司在Windows操作系统上开发的一套C++应用程序框架。
它提供了一系列的类和函数,使得开发者可以更快、更方便地开发Windows应用程序。
在MFC中,我们可以根据需要自定义控件。
编写MFC自定义控件的过程主要包括以下几个步骤:1.定义控件类:首先,我们需要定义一个派生自CWnd或CButton等基类的控件类。
派生类通常以"C"作为前缀,例如CCustomControl。
在控件类中,我们可以添加自定义的属性和方法。
2.注册控件类:在应用程序初始化时,我们需要调用AfxRegisterClass函数来注册自定义的控件类,以便能够在程序中使用。
3.创建控件对象:在创建控件的对话框或窗口时,我们需要使用Create函数来创建自定义的控件对象。
在Create函数中,我们可以指定控件的位置、大小等属性。
4.响应消息:在控件类中,我们可以重写一些成员函数来响应用户的消息,例如鼠标点击、键盘输入等。
我们可以使用ON_WM_XXX宏将消息和相应的成员函数关联起来。
5.绘制控件:在绘制控件时,我们可以重写控件类的OnPaint函数。
在OnPaint函数中,我们可以使用CDC类的成员函数来绘制自定义的图形。
6.响应交互:根据自定义的需求,我们可以在控件类中重写一些成员函数来响应用户的交互。
例如,在Button控件中,我们可以重写OnLButtonDown函数来响应鼠标左键的点击事件。
7.添加消息处理:在控件类中,我们可以添加自定义的消息处理函数来处理特定的业务逻辑。
例如,在自定义的列表框中,我们可以添加一个AddItem函数来向列表中添加项目。
8.发送和接收消息:在需要与其他窗口或控件进行通信时,我们可以使用SendMessage和PostMessage函数来发送消息,并在控件类中重写相应的消息处理函数来接收并处理这些消息。
MFC编程基础教程MFC(Microsoft Foundation Classes)是一套基于C++的应用程序框架,用于开发可视化的Windows应用程序。
MFC提供了丰富的工具和类库,使程序开发人员能够更加轻松地创建Windows应用程序。
一、MFC框架的介绍MFC是一种C++编程框架,用于开发Windows应用程序。
MFC提供了一系列的类和方法,用于处理窗口、消息处理、资源管理等常见的任务。
MFC框架的核心是一个称为CWinApp的类,它是应用程序的入口点。
二、MFC的基本概念1.窗口:MFC使用窗口来显示应用程序的用户界面。
窗口可以是主窗口、对话框、工具栏、菜单等。
2.消息处理函数:MFC使用消息机制来处理用户输入和系统事件。
消息处理函数是在收到特定的消息时执行的代码块。
3.控件:控件是用于用户交互的窗口元素,例如按钮、文本框、列表框等。
4.对象模型:MFC使用面向对象的概念来管理窗口和控件。
每个窗口或控件都是一个C++对象,有自己的属性和方法。
三、MFC应用程序的创建1.创建一个MFC应用程序的步骤:a. 新建项目:在Visual Studio中创建一个MFC应用程序项目。
c.编写代码:编写消息处理函数和其他代码,实现应用程序的功能。
d.编译和运行:编译项目并运行应用程序。
四、MFC消息处理1.应用程序的消息循环:MFC应用程序的消息循环负责接收和处理用户输入和系统事件。
2.消息映射表:消息映射表是一个用于将消息与消息处理函数关联的数据结构。
3.常见的消息类型:MFC提供了大量的消息类型,包括鼠标和键盘消息、窗口消息、菜单消息等。
五、MFC控件的使用1.控件的创建和操作:使用MFC提供的类和方法来创建和操作控件。
2.控件的属性设置:通过设置控件的属性来改变它的外观和行为。
3.控件事件的处理:通过处理控件的事件来响应用户的操作。
六、MFC对话框的使用2.对话框控件的操作:对话框中的控件可以像其他控件一样进行操作。
Windows提供了一个模拟键盘API函数Keybd_event(),使用该函数可以相应的屏蔽键盘的动作。
Keybd_event()函数能触发一个按键事件,也就是说会产生一个WM_KEYDOWN或WM_KEYUP消息。
函数原型:VOID keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,DWORD dwExtralnfo);共有四个参数:bVk:为按键的虚拟键码。
键码值必须在1~254之间,具体见键盘键值表。
bScan:为扫描码,一般置0即可。
dwFlags:为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP"。
dwExtralnfo:一般置0即可。
返回值:该函数无返回值。
1.用Visual Studio 2010,新建一个“MFC应用程序”。
2.选择“MFC应用程序”,名称随便命名,这里改为“J1”,添加一个按钮做测试用。
具体步骤省略,详见/view/e11617f4af1ffc4ffe47acc83.在设计界面中,双击“开始”按钮,进入代码界面,在箭头处添加代码如下://执行结果:点击按钮后会打开一个记事本,输入“HELLO”。
ShellExecute(NULL,"open","notepad.exe",NULL,NULL,SW_SHOW);//打开记事本Sleep(1000);//等待1秒HWND hWnd = ::FindWindow("Notepad",NULL); //获取记事本窗口的句柄if (hWnd)//当窗口存在时{::SetForegroundWindow(hWnd); //将窗口前置并激活}elseMessageBox("记事本没打开","提示");//模拟按下'CAPS LOCK'键,用于大写keybd_event(20,0,0,0);keybd_event(20,0,KEYEVENTF_KEYUP,0);//模拟按下'H'键keybd_event(72,0,0,0);keybd_event(72,0,KEYEVENTF_KEYUP,0);//模拟按下'E'键keybd_event(69,0,0,0);keybd_event(69,0,KEYEVENTF_KEYUP,0);//模拟按下'L'键keybd_event(76,0,0,0);keybd_event(76,0,KEYEVENTF_KEYUP,0);//模拟按下'L'键keybd_event(76,0,0,0);keybd_event(76,0,KEYEVENTF_KEYUP,0);//模拟按下'O'键keybd_event(79,0,0,0);keybd_event(79,0,KEYEVENTF_KEYUP,0);//模拟按下'回车'键keybd_event(13,0,0,0);keybd_event(13,0,KEYEVENTF_KEYUP,0);12.先“生成解决方案”,编译没有错误话,接下来就是调试了,试试看吧。
C++ MFC快速超简单入门学习注意:红色字体为重要的信息,必须理解并记住。
在学习MFC之前,你必须对C++的“类和对象有一定的认识和理解,因为MFC就是C++完全的面向对象设计,它里面封装了好多类,我们只要调用就OK,就像C语言调用库函数一样,直接使用,这就是C++第一特性:封装性,第二性就是继承与派生,这个在MFC中体现得淋淋至间(字打错了)。
如果不懂,我再来解释一下,例:有一个商品类,class GOODS 商品属性有名字,价格它可作为一个基类,我可以派上出苹果类,class Apple :public GOODS . 苹果属性出了继承了商品的属性名字,价格之外,还可派生出,颜色,等属性,继承与派生就是一个是另一个的子集,但是这个子集不仅包括父集的特征,还具有一些新的特性,懂了吧,这样。
MFC其中重要的类是:CDialog 对话框类,CEdit,(编辑框类)CButton,(按钮类)CRadio(单选钮类),这些都是作为基类,由我们自己定义的类去派生它们。
好了,现在先了解一下什么是MFC吧,请看当前目录下的MFC入门知识的幻灯片1—20张,或大概的浏览一下当前目录下的其它连个word文件,后面的幻灯片我觉得没必要看了,因为是快速吗,节约时间,(首先看不懂没关系,)但但看完之后,必须掌握如下知识:1.MFC是作什么用的?与以前我们写的C,C++语言有什么不同。
以及它的一些优点,不同,以前的是控制台的界面不好看,不友好,操作不方便,黑框框的一片。
MFC反之。
优点:可用极少的代码实现强大的功能,2.关于MFC的一些术语,概念啊3.你要知道MFC的对话框是由控件组成的,具有哪些控件(例按钮:Button, 单选钮:radio,Edit)例:要知道MFC的编程的原则,也就是宗旨理念吧,“消息映射,事件驱动“,这句话要记住并理解,很重要,真的。
那到底是什么意思呢?现实举例:一个人具备一种“感知“的能力,(也可称消息吧),当用火接近这个人时(发生的事件),就会(驱动)这个人做出反应,远离”火“,用MFC举例:一个按钮有什么消息啊,我可以单击它,所以它具备单击的消息:第一个就是左键单击的消息,第二个就是双击的消息,见名思议就OK了。
MFC使用教程第一部分:MFC简介Visual C++ 不仅仅是一个编译器。
它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的C++ 来开发出专业级的Windows 应用程序。
为了能充分利用这些特性,你必须理解C++ 程序设计语言。
掌握了C++,你就必须掌握Microsoft 基本类库(MFC) 的层次结构。
该层次结构包容了Windows API 中的用户界面部分,并使你能够很容易地以面向对象的方式建立Windows 应用程序。
这种层次结构适用于所有版本的Windows 并彼此兼容。
你用MFC 所建立的代码是完全可移植的。
简单介绍MFC的基本概念和术语以及事件驱动程序设计方法。
输入、编译和运行一个简单的MFC程序。
第二部分中将详细解释这些代码。
第三部分讨论了MFC控件和如何定制它们。
什么是MFC?如果你要建立一个Windows 应用程序,应该如何下手?好的开端是从设计用户界面开始。
首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。
Windows 用户界面有一些标准的控件,如按钮、菜单、滚动条和列表等,这对那些Windows 用户已经是很熟悉了。
要记住的是,作为程序员必须选择一组控件并决定如何把它们安排到屏幕上。
传统上,你需要在纸上做一下用户界面的草图,直到对各元素感到满意为止。
这对于一些比较小的项目,以及一些大项目的早期原型阶段是可以的。
下一步,是要实现代码。
为任何Windows 平台建立应用程序时,程序员都有两种选择:C 或C++。
使用C,程序员是在Windows 应用程序界面( API ) 的水平上编写代码。
该界面是由几百个 C 函数所组成,这些函数在Windows API 参考手册中都有介绍。
对于Windows NT, API 被称为"Win32 API",以区别于其用于Windows 3.1的16位API, Microsoft 也提供了C++ 库,它位于任何Windows API 之上,能够使程序员的工作更容易。
MFC中基于SDI和MDI的程序,默认情况下有快捷键资源,直接建立快捷键与消息的映射,就能实现程序的快捷键,而基于对话框的程序默认情况下没有快捷键资源,鉴于网友问到这个问题,下面我就分别用两种方法来实现。
一是在PreTranslateMessage函数中,判断键盘的按键消息,比如快捷键是Ctrl + Q,我们就检测按键消息的Ctrl键和Q是否同时按下就可以了。
//用PreTranslateMessage的方法,判断Ctrl+Q是否按下,按下就执行快捷键对应的操作if(pMsg->message == WM_KEYDOWN && pMsg->wParam == 'Q' && IsCTRLPressed()){AfxMessageBox("Ctrl + Q 被按下");return TRUE;}二是在PreTranslateMessage函数中,通过载入快捷键资源,并建立快捷键与消息的映射的方法来实现。
先插入快捷键资源,通过下面的代码来载入该资源。
HACCEL hAcc;hAcc = LoadAccelerators(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));在PreTranslateMessage函数中进行快捷键的翻译,如果是WM_KEYDOWN和WM_SYSKEYDOWN消息就翻译,翻译成功返回TRUE。
BOOL CAccelerator2Dlg::PreTranslateMessage(MSG* pMsg){// TODO: Add your specialized code here and/or call the base classint iResult;//针对WM_KEYDOWN消息和WM_SYSKEYDOWN消息,翻译快捷键switch(pMsg->message){case WM_KEYDOWN:case WM_SYSKEYDOWN:iResult = TranslateAccelerator(m_hWnd,hAcc,pMsg);//翻译快捷键成功,返回TRUEif(iResult)return TRUE;}return CDialog::PreTranslateMessage(pMsg);}下面处理快捷键对应的响应,在该实例中,快捷键表中建立了Ctrl +Q,Shift + Q,Alt + Q,Ctrl + Shift + Q,Ctrl + Alt + Q,Shift + Alt + Q,Ctrl + Shift + Alt + Q六个快捷键分别进行测试。
MFC基础教程MFC(Microsoft Foundation Classes)是微软公司开发的一组C++类库,用于开发Windows平台的应用程序。
MFC提供了许多用于创建图形用户界面和处理用户输入的类和函数,使开发者能够更轻松地构建Windows应用程序。
对于初学者来说,学习MFC可以帮助他们快速入门Windows编程,并且能够开发出功能丰富的应用程序。
本教程将向初学者介绍MFC的基础知识和使用方法。
1.MFC的概述MFC是构建Windows应用程序的一种开发方式。
它提供了大量的类和函数,包括窗口、对话框、控件、消息处理等,用于简化开发者创建和操作Windows界面的过程。
2.开发环境准备在开始学习MFC之前,需要安装Visual Studio等集成开发环境。
Visual Studio是一个开发Windows应用程序的强大工具,它包含了MFC 类库和丰富的开发工具。
3.创建MFC应用程序在Visual Studio中,可以选择创建一个MFC应用程序项目。
在创建项目的过程中,可以选择使用对话框、单文档或多文档应用程序。
4.MFC应用程序的结构MFC应用程序通常由一个或多个窗口或对话框组成。
窗口是应用程序的主要界面,可以包含菜单、工具栏、状态栏等。
对话框用于收集用户输入或显示特定信息。
5.消息映射和消息处理MFC应用程序通过消息系统与用户交互。
当用户执行一些操作(例如点击按钮、按下键盘)时,应用程序会接收到相应的消息。
通过消息映射和消息处理函数,可以定义应用程序对不同消息的响应。
6.控件的使用7.对话框的使用8.文件操作MFC提供了丰富的文件操作功能,包括打开、保存、读取和写入文件等。
通过MFC类中的方法,可以轻松地进行文件操作,并处理异常情况。
9.资源管理10.调试和错误处理在开发应用程序时,调试和错误处理是非常重要的。
MFC提供了丰富的调试工具和机制,帮助开发者快速定位和修复错误。
通过使用断点、输出调试信息等方法,可以更好地调试应用程序。
VC MFC 键盘消息的截取与响应.txt 可以通过重载虚函数PreTranslateMessage()对所关心的消息进行截取与响应:以下对截取与响应键盘 Enter 消息的截取与响应这是对话框的响应键盘 Enter 消息方式:BOOL C**Dlg::PreTranslateMessage(MSG* pMsg){// TODO: 在此添加专用代码和/或调用基类//判断是否为键盘消息if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST){//判断是否按下键盘Enter键if(pMsg->wParam==VK_RETURN){//Do anything what you want toreturn TRUE;}}return CDialog::PreTranslateMessage(pMsg);}这是View视图类响应键盘 Enter 消息的方式:BOOL C**View::PreTranslateMessage(MSG* pMsg){if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST){if(pMsg->wParam==VK_RETURN ){//Do anything you want herereturn TRUE;}}return CFormView::PreTranslateMessage(pMsg);}在上面的代码中,首先将pMsg->message所表示的消息同WM_KEYFIRST 和WM_KEYLAST比较,确定是键盘消息,然后通过消息参数pMsg->wParam的值来判断是否是回车键(VK_RETURN,虚拟键码可以下面相关资料中查到)。
常用的Delete键的虚拟键码为:VK_DELETE 其他相关的自己慢慢找吧,呵呵。
#define VK_LBUTTON 0x01#define VK_RBUTTON 0x02#define VK_CANCEL 0x03#define VK_MBUTTON 0x04#if(_WIN32_WINNT >= 0x0500)#define VK_XBUTTON1 0x05#define VK_XBUTTON2 0x06#endif#define VK_BACK 0x08#define VK_TAB 0x09#define VK_CLEAR 0x0C#define VK_RETURN 0x0D#define VK_SHIFT 0x10#define VK_CONTROL 0x11#define VK_MENU 0x12#define VK_PAUSE 0x13#define VK_CAPITAL 0x14#define VK_KANA 0x15#define VK_HANGEUL 0x15#define VK_HANGUL 0x15#define VK_JUNJA 0x17#define VK_FINAL 0x18#define VK_HANJA 0x19#define VK_KANJI 0x19#define VK_ESCAPE 0x1B#define VK_CONVERT 0x1C#define VK_NONCONVERT 0x1D#define VK_ACCEPT 0x1E#define VK_MODECHANGE 0x1F#define VK_SPACE 0x20#define VK_PRIOR 0x21#define VK_END 0x23 #define VK_HOME 0x24 #define VK_LEFT 0x25 #define VK_UP 0x26 #define VK_RIGHT 0x27 #define VK_DOWN 0x28 #define VK_SELECT 0x29 #define VK_PRINT 0x2A #define VK_EXECUTE 0x2B #define VK_SNAPSHOT 0x2C #define VK_INSERT 0x2D #define VK_DELETE 0x2E #define VK_HELP 0x2F#define VK_LWIN 0x5B #define VK_RWIN 0x5C #define VK_APPS 0x5D#define VK_SLEEP 0x5F#define VK_NUMPAD0 0x60 #define VK_NUMPAD1 0x61 #define VK_NUMPAD2 0x62 #define VK_NUMPAD3 0x63 #define VK_NUMPAD4 0x64 #define VK_NUMPAD5 0x65 #define VK_NUMPAD6 0x66 #define VK_NUMPAD7 0x67 #define VK_NUMPAD8 0x68 #define VK_NUMPAD9 0x69 #define VK_MULTIPLY 0x6A #define VK_ADD 0x6B #define VK_SEPARATOR 0x6C #define VK_SUBTRACT 0x6D #define VK_DECIMAL 0x6E #define VK_DIVIDE 0x6F #define VK_F1 0x70 #define VK_F2 0x71 #define VK_F3 0x72 #define VK_F4 0x73 #define VK_F5 0x74 #define VK_F6 0x75 #define VK_F7 0x76#define VK_F9 0x78#define VK_F10 0x79#define VK_F11 0x7A#define VK_F12 0x7B#define VK_F13 0x7C#define VK_F14 0x7D#define VK_F15 0x7E#define VK_F16 0x7F#define VK_F17 0x80#define VK_F18 0x81#define VK_F19 0x82#define VK_F20 0x83#define VK_F21 0x84#define VK_F22 0x85#define VK_F23 0x86#define VK_F24 0x87#define VK_NUMLOCK 0x90#define VK_SCROLL 0x91#define VK_OEM_NEC_EQUAL 0x92 // '=' key on numpad#define VK_OEM_FJ_JISHO 0x92 // 'Dictionary' key#define VK_OEM_FJ_MASSHOU 0x93 // 'Unregister word' key #define VK_OEM_FJ_TOUROKU 0x94 // 'Register word' key #define VK_OEM_FJ_LOYA 0x95 // 'Left OYAYUBI' key#define VK_OEM_FJ_ROYA 0x96 // 'Right OYAYUBI' key#define VK_LSHIFT 0xA0#define VK_RSHIFT 0xA1#define VK_LCONTROL 0xA2#define VK_RCONTROL 0xA3#define VK_LMENU 0xA4#define VK_RMENU 0xA5#if(_WIN32_WINNT >= 0x0500)#define VK_BROWSER_BACK 0xA6#define VK_BROWSER_FORWARD 0xA7#define VK_BROWSER_REFRESH 0xA8#define VK_BROWSER_STOP 0xA9#define VK_BROWSER_SEARCH 0xAA#define VK_BROWSER_FAVORITES 0xAB#define VK_BROWSER_HOME 0xAC#define VK_VOLUME_MUTE 0xAD#define VK_VOLUME_DOWN 0xAE#define VK_VOLUME_UP 0xAF#define VK_MEDIA_NEXT_TRACK 0xB0#define VK_MEDIA_PREV_TRACK 0xB1#define VK_MEDIA_STOP 0xB2#define VK_MEDIA_PLAY_PAUSE 0xB3#define VK_LAUNCH_MAIL 0xB4#define VK_LAUNCH_MEDIA_SELECT 0xB5#define VK_LAUNCH_APP1 0xB6#define VK_LAUNCH_APP2 0xB7#endif#define VK_OEM_1 0xBA // ';:' for US#define VK_OEM_PLUS 0xBB // '+' any country#define VK_OEM_COMMA 0xBC // ',' any country#define VK_OEM_MINUS 0xBD // '-' any country#define VK_OEM_PERIOD 0xBE // '.' any country#define VK_OEM_2 0xBF // '/?' for US#define VK_OEM_3 0xC0 // '`~' for US#define VK_OEM_4 0xDB // '[{' for US#define VK_OEM_5 0xDC // '\|' for US#define VK_OEM_6 0xDD // ']}' for US#define VK_OEM_7 0xDE // ''"' for US#define VK_OEM_8 0xDF#define VK_OEM_AX 0xE1 // 'AX' key on Japanese AX kbd#define VK_OEM_102 0xE2 // "<>" or "\|" on RT 102-key kbd. #define VK_ICO_HELP 0xE3 // Help key on ICO#define VK_ICO_00 0xE4 // 00 key on ICO#if(WINVER >= 0x0400)#define VK_PROCESSKEY 0xE5#endif#define VK_ICO_CLEAR 0xE6今夜月明人尽望,不知愁思落谁家。