20160209.CCPP体系详解(0019天)
Posted 尹成
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20160209.CCPP体系详解(0019天)相关的知识,希望对你有一定的参考价值。
程序片段(01):01.字符串.c
内容概要:字符串
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
//00.语音合成与语音识别:
// 语音合成:文字-->语音
// 语音识别:语音-->文字
// 注:任何语音操作都应当使用宽字符!
//01.宽窄字符问题1:
// 1.窄字符采用单字节存储,宽字符采用双字节存储!
// 宽窄字符的"本质区别"在于存储数据的盒子尺寸不一样!
// 2.宽窄字符当中使用sizeof关键字的情况区分:
// 1.sizeof求取的是数据类型所占用的尺寸而不是实际数据本身所占用的尺寸
// 2.但是操作"实际数据本身"的时候都是一样的
// 注:如果项目采用Unicode字符集,那所有非ASCII字符集范围内
// 的字符都必须采用宽字符进行存储(也即是除开英文之外的字符)
// 再加上本地化的设置才能正确的表示文字信息
int main01(void)
char ch = 'A';//窄字符-->1个字节:不可以存储单个汉字儿
wchar_t wch = L'A';//宽字符-->2个字节:可以存储单个汉字儿
printf("%d ,%d \\n", sizeof(ch), sizeof(wch));
printf("%d ,%d \\n", ch, wch);//内容一致-->ASCII码值一样
system("pause");
//02.宽窄字符问题2:
// 1.宽窄字符只是存储数据的盒子不一样:
// 如果存储内容一样,那么二进制数据本质一样
// 2.Unicode字符集+(语言环境设置+宽字符使用):
// 才能使得除开标准ASCII编码集的字符之外的字符能够正确显示
// 3.只要在Unicode字符集的情况之下,所有内容都采用宽字符
// 就能保证字符的正确存储与使用
// 注:宽字符也是字符,只不过表象比窄字符多了一个宽字符标识符"L"
// 但还是需要使用单引号('')进行宽字符标识
int main02(void)
char ch = 'A';
putchar(ch);
//wchar_t wch = L'A';
//putwchar(wch);
setlocale(LC_ALL, "zh-CN");
wchar_t wch = L'我';
putwchar(wch);//采用字符集+设定语言环境+使用宽字符+使用宽字符操作函数-->字符正确存储并使用
system("pause");
//03.宽窄字符问题3:
// 1.VS默认配置情况下,所有字符都采用窄字符进行存储:
// 因为窄字符对于ASCII编码表当中的字符都能够进行兼容
// 2.代码区的内容不可以进行修改!(编译不报错,运行直接挂掉!)
// 找到代码区+突破权限
// 3.代码区当中的两块儿重要内存(常量池和符号表):
// 常量池:只需要拷贝指针,直接进行访问(类似于函数传参,针对于数组无副本机制)
// 提高内存操作效率
// 符号表:但需要拷贝数据,生成于寄存器(必须通过寄存器进行数据的传递操作)
// 注:只要是代码区的内容,就不可以直接进行修改,无论是常量池内容还是符号表内容
// 但是通过Detours这款工具就可以突破任何Windows程序的代码区"访问权限",并且
// 可以对该代码区的内容进行直接修改"修改权限"
int main03(void)
char * pStr = "notepad";
printf("%d \\n", sizeof(pStr));
printf("%d \\n", sizeof("notepad"));
printf("%p \\n", pStr);//该地址属于(内存-->代码区)的地址
//*pStr = 'A';//由于该指针所指向的内存区块儿位于代码区,因此只可读不可写[因为这里访问的字符串位于代码区常量池]
//"notepad"这个字符串属于代码区的常量池当中,该常量池也被称作为只读常量池
//"notepad"字符串都存储于代码区常量池,非字符串常量需要拷贝数据到寄存器才能对内存进行间接操作
//字符串传递的是地址
system("pause");
//04.宽窄字符问题4:
// 1.针对于英文,使用宽窄字符的效果都一样,不同的只是存储字符的盒子尺寸不一样
// 宽窄字符的针对对象:非英文|非标准ASCII码表包含字符
// 2.无论是针对于窄字符字符串还是宽字符字符串,该字符串的结尾标识符都是字符'\\0'
// 注:只不过区分窄字符('\\0')和宽字符(L'\\0')所占用的存储空间尺寸不一样!
// (1).strlen和sizeof();的区别(一个是求取有效字符数;一个是求取实际"占用"字节数)
// 区分:"占用"和"实际"两个关键词儿的区别
// (2).sizeof();取值运算符(星号:"*")加字符指针(区分宽窄字符指针),
// 所求字节数为单个相应字符(宽窄)所占用的字节数
// 3.宽窄字符的打印:
// wprintf+L"格式字符串"+格式控制符
// 注:严格区分"格式字符串"和"格式控制符"之间的区别
// 4.字符指针所指向的数据有多重解析方式:
// 字符串层面的意义解析方式(字符串函数)+字符层面的解析范式(sizeof关键字)
// 注:切忌注意!
int main04(void)
setlocale(LC_ALL, "zh-CN");
wchar_t * pWchar = L"你好天朝";//代码区常量池
printf("%d, %d \\n", sizeof(pWchar), sizeof(*pWchar));//特殊点!->两个字节
printf("%d \\n", sizeof(L"你好天朝"));//实际占用内存尺寸!
//printf("%p \\n", pWchar);
wprintf(L"%p \\n", pWchar);
system("pause");
//05.通过字符指针访问字符指针所指向的内存实体,只能访问到单个字符的效果!
// 数组:一旦前置手动初始化,那么后置一定是默认初始化,数据自动清为零
// 无论前置初始化的内容是什么,后置自动初始化的数据都为0
// 注:初始化与赋值的概念不同
// 取值运算符+字符指针-->只能访问到单个字符(区分宽窄字符!)
int main05(void)
char * pStr = "notepad";//窄字符字符串,pStr是指针变量,存储的是(代码区常量池)中的常量字符串的首地址
//pStr可以存储不同的指针,属于变量指针
*pStr = 'A';//随时注意指针变量所指向的内存空间的访问权限(代码区只可读,不可写,除非借助Detours)
char str[100] = "calc";
//str = 1;//str作为数组名是常量指针
//拷贝字符串到数组,等同于对数组的前置初始化,后置默认初始化,因此后续数据全部清零
printf("%p \\n", str);
//system(str);
*str = 'X';//通过(取值运算符+字符指针)只能访问到单个字符(区分宽窄字符)
system("pause");
//06.宽窄字符数组注意事项:
// 1.数组名一定不可以直接进行修改!-->常量指针
// 2.C语言判断两个字符串是否相等的方式strcmp(str1, str2);函数
// 注:sizeof();和strlen();所求取的长度意义不同
// sizeof();求取的是真实的内存尺寸!
// strlen();和wstrlen();只是求取"有效"字符个数!
int main06(void)
char str1[100] = "calc";
char str2[100] = "calc1";
//char * p;
//str1 = str2;//比较的是常量指针的值
if (0 == strcmp(str1, str2))
printf("相等! \\n");
else
printf("不相等! \\n");
wchar_t wStr[100] = L"您好天朝";
printf("%d \\n", sizeof(wStr));
system("pause");
程序片段(02):speechrecognition.cpp
内容概要:语音识别
#include <windows.h>
#include <atlstr.h>
#include <sphelper.h>
#include <sapi.h>
#include<comutil.h>
#include<string.h>//01.所需头文件
#pragma comment(lib,"sapi.lib")
#pragma comment(lib, "comsupp.lib") //02.链接静态库
#define GID_CMD_GR 333333
#define WM_RECOEVENT WM_USER+1
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//03.所需COM组件:通过COM组件实现语音(识别|合成)功能
char szAppName[] = "TsinghuaYincheng";
BOOL b_initSR;
BOOL b_Cmd_Grammar;
CComPtr<ISpRecoContext>m_cpRecoCtxt; //语音识别程序接口
CComPtr<ISpRecoGrammar>m_cpCmdGramma; //识别语法
CComPtr<ISpRecognizer>m_cpRecoEngine; //语音识别引擎
int speak(wchar_t *str);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance =hInstance;
wndclass.lpfnWndProc =WndProc;
wndclass.lpszClassName =szAppName;
wndclass.lpszMenuName =NULL;
wndclass.style =CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndclass))
MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
return 0;
speak(L"尹成是一个猥琐男,曾彬更加猥琐,Hello XiaoBin i love you!!!");//04.语音合成:将文件转化为语音(注:使用宽字符)
//05.关于语音方面的编程概念:
// 1.什么叫做语音识别?什么叫做语音合成?
// 语音识别:将声音转化为文字
// 语音合成:将文字转化为声音
// 2.语音识别必须采用宽字符!
// 配置:项目属性-->Unicode字符集-->宽字符操作(所有都使用宽字符)
// speak(NULL);//表示不说话
hwnd=CreateWindow(szAppName,
TEXT("清华-尹成语音识别教程"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
TranslateMessage(&msg);
DispatchMessage(&msg);
return msg.wParam;
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
HDC hdc;
PAINTSTRUCT ps;
switch(message)
case WM_CREATE:
//初始化COM端口
::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
//创建识别引擎COM实例为共享型
HRESULT hr=m_cpRecoEngine.CoCreateInstance(CLSID_SpSharedRecognizer);
//创建识别上下文接口
if(SUCCEEDED(hr))
hr=m_cpRecoEngine->CreateRecoContext(&m_cpRecoCtxt);
else MessageBox(hwnd,TEXT("error1"),TEXT("error"),S_OK);
//设置识别消息,使计算机时刻监听语音消息
if(SUCCEEDED(hr))
hr=m_cpRecoCtxt->SetNotifyWindowMessage(hwnd,WM_RECOEVENT,0,0);
else MessageBox(hwnd,TEXT("error2"),TEXT("error"),S_OK);
//设置我们感兴趣的事件
if(SUCCEEDED(hr))
ULONGLONG ullMyEvents=SPFEI(SPEI_SOUND_START)|SPFEI(SPEI_RECOGNITION)|SPFEI(SPEI_SOUND_END);
hr=m_cpRecoCtxt->SetInterest(ullMyEvents,ullMyEvents);
else MessageBox(hwnd,TEXT("error3"),TEXT("error"),S_OK);
//创建语法规则
b_Cmd_Grammar=TRUE;
if(FAILED(hr))
MessageBox(hwnd,TEXT("error4"),TEXT("error"),S_OK);
hr=m_cpRecoCtxt->CreateGrammar(GID_CMD_GR,&m_cpCmdGramma);
WCHAR wszXMLFile[20]=L"er.xml";
MultiByteToWideChar(CP_ACP,0,(LPCSTR)"er.xml",-1,wszXMLFile,256);
hr=m_cpCmdGramma->LoadCmdFromFile(wszXMLFile,SPLO_DYNAMIC);
if(FAILED(hr))
MessageBox(hwnd,TEXT("error5"),TEXT("error"),S_OK);
b_initSR=TRUE;
//在开始识别时,激活语法进行识别
hr=m_cpCmdGramma->SetRuleState(NULL,NULL,SPRS_ACTIVE);
return 0;
case WM_RECOEVENT:
RECT rect;
GetClientRect(hwnd,&rect);
hdc=GetDC(hwnd);
USES_CONVERSION;
CSpEvent event;
while(event.GetFrom(m_cpRecoCtxt)==S_OK)
switch(event.eEventId)
case SPEI_RECOGNITION:
static const WCHAR wszUnrecognized[]=L"<Unrecognized>";
CSpDynamicString dstrText;
//取得识别结果
if(FAILED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE,SP_GETWHOLEPHRASE,TRUE,&dstrText,NULL)))
dstrText=wszUnrecognized;
BSTR SRout;
dstrText.CopyToBSTR(&SRout);
char* lpszText2 = _com_util::ConvertBSTRToString(SRout);//06.获取语音识别之后所生成的字符串
if(b_Cmd_Grammar)
char * str[15] = "我是学霸","清华土匪","天下无双","吴伟","曾彬",//07.查表法所对应的字符串表
"记事本","计算器","关机","重启","取消","画图板",
"何栋","林振华","聂千琳","赵学辉";
int i = -1;
for (int j = 0; j < 15;j++)
if (strcmp(str[j], lpszText2) == 0)
i = j;
MessageBoxA(0, lpszText2, lpszText2, 0);//弹出对话框
DrawText(hdc, TEXT(lpszText2), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);//在窗体当中写一段儿文字
switch (i)//08.根据查表法所查询到的结果,进行针对于结果的处理
case -1:
break;
case 0:
speak(L"男神是学霸");
break;
case 1:
speak(L"猥琐男尹成");
break;
case 2:
speak(L"曾彬猥琐的天下无创");
break;
case 3:
speak(L"男神帅的惊动了白宫");
break;
case 4:
speak(L"曾彬猥琐的的惊动了白宫");
break;
case 5:
system("start calc");//09.需要采用异步进行打开
break;
case 6:
system("start notepad");
break;
case 7:
system("shutdown -s -t 600");
break;
case 8:
system("shutdown -r -t 600");
break;
case 9:
system("shutdown -a");//10.取消(关机|重启)指令
break;
case 10:
system("start mspaint");
break;
case 11:
speak(L"何栋向三大金刚问好");//11.注意:通过语音识别的联系,可以提高语音识别的精确度!
break;
case 12:
speak(L"振华睡得很晚");//12.Debug模式相比Release模式更加的消耗资源
break;
case 13:
speak(L"聂千琳爱编码");//13.某些COM组件的调用需要在Debug模式下进行
break;
case 14:
speak(L"赵学辉爱编码");//14.经过语音识别训练之后,电脑的语音识别效果更佳!
break;
default:
break;
return TRUE;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
return DefWindowProc(hwnd,message,wParam,lParam);
#pragma comment(lib, "ole32.lib") //CoInitialize CoCreateInstance需要调用ole32.dll
int speak(wchar_t *str)
ISpVoice * pVoice = NULL;
::CoInitialize(NULL);
//获取ISpVoice接口:
long hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
hr = pVoice->Speak(str, 0, NULL);
pVoice->Release();
pVoice = NULL;
//千万不要忘记:
::CoUninitialize();
return TRUE;
程序片段(03):speechrecognition.cpp
内容概要:语音识别
#include <windows.h>
#include <atlstr.h>
#include <sphelper.h>
#include <sapi.h>
#include<comutil.h>
#include<string.h>
#pragma comment(lib,"sapi.lib")
#pragma comment(lib, "comsupp.lib")
#define GID_CMD_GR 333333
#define WM_RECOEVENT WM_USER+1
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
char szAppName[] = "TsinghuaYincheng";
BOOL b_initSR;
BOOL b_Cmd_Grammar;
CComPtr<ISpRecoContext>m_cpRecoCtxt; //语音识别程序接口
CComPtr<ISpRecoGrammar>m_cpCmdGramma; //识别语法
CComPtr<ISpRecognizer>m_cpRecoEngine; //语音识别引擎
int speak(wchar_t *str);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.cbClsExtra =0;
wndclass.cbWndExtra =0;
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
wndclass.hInstance =hInstance;
wndclass.lpfnWndProc =WndProc;
wndclass.lpszClassName =szAppName;
wndclass.lpszMenuName =NULL;
wndclass.style =CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndclass))
MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
return 0;
speak(L"尹成是一个猥琐男");
// speak(NULL);
hwnd=CreateWindow(szAppName,
TEXT("清华-尹成语音识别教程"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
TranslateMessage(&msg);
DispatchMessage(&msg);
return msg.wParam;
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
HDC hdc;
PAINTSTRUCT ps;
switch(message)
case WM_CREATE:
//初始化COM端口
::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
//创建识别引擎COM实例为共享型
HRESULT hr=m_cpRecoEngine.CoCreateInstance(CLSID_SpSharedRecognizer);
//创建识别上下文接口
if(SUCCEEDED(hr))
hr=m_cpRecoEngine->CreateRecoContext(&m_cpRecoCtxt);
else MessageBox(hwnd,TEXT("error1"),TEXT("error"),S_OK);
//设置识别消息,使计算机时刻监听语音消息
if(SUCCEEDED(hr))
hr=m_cpRecoCtxt->SetNotifyWindowMessage(hwnd,WM_RECOEVENT,0,0);
else MessageBox(hwnd,TEXT("error2"),TEXT("error"),S_OK);
//设置我们感兴趣的事件
if(SUCCEEDED(hr))
ULONGLONG ullMyEvents=SPFEI(SPEI_SOUND_START)|SPFEI(SPEI_RECOGNITION)|SPFEI(SPEI_SOUND_END);
hr=m_cpRecoCtxt->SetInterest(ullMyEvents,ullMyEvents);
else MessageBox(hwnd,TEXT("error3"),TEXT("error"),S_OK);
//创建语法规则
b_Cmd_Grammar=TRUE;
if(FAILED(hr))
MessageBox(hwnd,TEXT("error4"),TEXT("error"),S_OK);
hr=m_cpRecoCtxt->CreateGrammar(GID_CMD_GR,&m_cpCmdGramma);
WCHAR wszXMLFile[20]=L"er.xml";
MultiByteToWideChar(CP_ACP,0,(LPCSTR)"er.xml",-1,wszXMLFile,256);
hr=m_cpCmdGramma->LoadCmdFromFile(wszXMLFile,SPLO_DYNAMIC);
if(FAILED(hr))
MessageBox(hwnd,TEXT("error5"),TEXT("error"),S_OK);
b_initSR=TRUE;
//在开始识别时,激活语法进行识别
hr=m_cpCmdGramma->SetRuleState(NULL,NULL,SPRS_ACTIVE);
return 0;
case WM_RECOEVENT:
RECT rect;
GetClientRect(hwnd,&rect);
hdc=GetDC(hwnd);
USES_CONVERSION;
CSpEvent event;
while(event.GetFrom(m_cpRecoCtxt)==S_OK)
switch(event.eEventId)
case SPEI_RECOGNITION:
static const WCHAR wszUnrecognized[]=L"<Unrecognized>";
CSpDynamicString dstrText;
//取得识别结果
if(FAILED(event.RecoResult()->GetText(SP_GETWHOLEPHRASE,SP_GETWHOLEPHRASE,TRUE,&dstrText,NULL)))
dstrText=wszUnrecognized;
BSTR SRout;
dstrText.CopyToBSTR(&SRout);
char* lpszText2 = _com_util::ConvertBSTRToString(SRout);
if(b_Cmd_Grammar)
if (strcmp("跳跃",lpszText2)==0)
keybd_event(VK_SPACE, 0, 0, 0);//按下
keybd_event(VK_SPACE, 0, 2, 0);//松开
if (strcmp("趴下", lpszText2) == 0)
keybd_event('Y', 0, 0, 0);//按下
keybd_event('Y', 0, 2, 0);//松开
if (strcmp("后前前", lpszText2) == 0)
keybd_event('S', 0, 0, 0);//按下
keybd_event('S', 0, 2, 0);//松开
keybd_event('W', 0, 0, 0);//按下
keybd_event('W', 0, 2, 0);//松开
keybd_event('W', 0, 0, 0);//按下
keybd_event('W', 0, 2, 0);//松开
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//01.鼠标左键按下才开始攻击鼠标位置的人物!
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
MapVirtualKey映射
//keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), 0, 0);//按下
//keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), 2, 0);//松开
if (strcmp("左右前", lpszText2) == 0)
keybd_event('A', 0, 0, 0);//按下
keybd_event('A', 0, 2, 0);//松开
keybd_event('D', 0, 0, 0);//按下
keybd_event('D', 0, 2, 0);//松开
keybd_event('W', 0, 0, 0);//按下
keybd_event('W', 0, 2, 0);//松开
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
if (strcmp("火冒三丈", lpszText2) == 0)
keybd_event(VK_OEM_102, 0, 0, 0);//按下//02.C语言函数模拟反斜杠("\\")
keybd_event(VK_OEM_102, 0, 2, 0);//松开 \\ang
keybd_event('A', 0, 0, 0);//按下
keybd_event('A', 0, 2, 0);//松开
keybd_event('N', 0, 0, 0);//按下
keybd_event('N', 0, 2, 0);//松开
keybd_event('G', 0, 0, 0);//按下
keybd_event('G', 0, 2, 0);//松开
//MapVirtualKey映射
keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN,0), 0, 0);//按下
keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), 2, 0);//松开
if (strcmp("旋风刀", lpszText2) == 0)
keybd_event('A', 0, 0, 0);//按下
keybd_event('A', 0, 2, 0);//松开
keybd_event('D', 0, 0, 0);//按下
keybd_event('D', 0, 2, 0);//松开
keybd_event('S', 0, 0, 0);//按下
keybd_event('S', 0, 2, 0);//松开
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
if (strcmp("大枪", lpszText2) == 0)
keybd_event(VK_OEM_102, 0, 0, 0);//按下
keybd_event(VK_OEM_102, 0, 2, 0);//松开 \\ang
keybd_event('W', 0, 0, 0);//按下
keybd_event('W', 0, 2, 0);//松开
keybd_event('E', 0, 0, 0);//按下
keybd_event('E', 0, 2, 0);//松开
keybd_event('A', 0, 0, 0);//按下
keybd_event('A', 0, 2, 0);//松开
keybd_event('P', 0, 0, 0);//按下
keybd_event('P', 0, 2, 0);//松开
keybd_event('O', 0, 0, 0);//按下
keybd_event('O', 0, 2, 0);//松开
keybd_event('N', 0, 0, 0);//按下
keybd_event('N', 0, 2, 0);//松开
keybd_event(VK_SPACE, 0, 0, 0);//按下
keybd_event(VK_SPACE, 0, 2, 0);//松开
keybd_event(VK_NUMPAD7, 0, 0, 0);//按下 //03.数字键所对应的虚拟映射键
keybd_event(VK_NUMPAD7, 0, 2, 0);//松开
//MapVirtualKey映射
keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), 0, 0);//按下
keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), 2, 0);//松开
if (strcmp("大刀", lpszText2) == 0)
keybd_event(VK_OEM_102, 0, 0, 0);//按下
keybd_event(VK_OEM_102, 0, 2, 0);//松开 \\ang
keybd_event('W', 0, 0, 0);//按下
keybd_event('W', 0, 2, 0);//松开
keybd_event('E', 0, 0, 0);//按下
keybd_event('E', 0, 2, 0);//松开
keybd_event('A', 0, 0, 0);//按下
keybd_event('A', 0, 2, 0);//松开
keybd_event('P', 0, 0, 0);//按下
keybd_event('P', 0, 2, 0);//松开
keybd_event('O', 0, 0, 0);//按下
keybd_event('O', 0, 2, 0);//松开
keybd_event('N', 0, 0, 0);//按下
keybd_event('N', 0, 2, 0);//松开
keybd_event(VK_SPACE, 0, 0, 0);//按下
keybd_event(VK_SPACE, 0, 2, 0);//松开
keybd_event(VK_NUMPAD6, 0, 0, 0);//按下
keybd_event(VK_NUMPAD6, 0, 2, 0);//松开
//MapVirtualKey映射
keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), 0, 0);//按下
keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), 2, 0);//松开
if (strcmp("刺蛇", lpszText2) == 0)
keybd_event(VK_OEM_102, 0, 0, 0);//按下
keybd_event(VK_OEM_102, 0, 2, 0);//松开 \\ang
keybd_event('W', 0, 0, 0);//按下
keybd_event('W', 0, 2, 0);//松开
keybd_event('E', 0, 0, 0);//按下
以上是关于20160209.CCPP体系详解(0019天)的主要内容,如果未能解决你的问题,请参考以下文章