er.xml)。WM_RECOEVENT 消息,窗口過程中解析並調用 QQ 操作函數。// 初始化 SAPI
::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
m_cpRecoEngine.CoCreateInstance(CLSID_SpSharedRecognizer);
m_cpRecoEngine->CreateRecoContext(&m_cpRecoCtxt);
m_cpRecoCtxt->SetNotifyWindowMessage(hwnd, WM_RECOEVENT, 0, 0);
m_cpRecoCtxt->CreateGrammar(GID_CMD_GR, &m_cpCmdGramma);
m_cpCmdGramma->LoadCmdFromFile(L"er.xml", SPLO_DYNAMIC);
m_cpCmdGramma->SetRuleState(NULL, NULL, SPRS_ACTIVE);
// 消息循環中處理識別結果
case SPEI_RECOGNITION:
CSpDynamicString dstrText;
event.RecoResult()->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE, &dstrText, NULL);
char* cmd = _com_util::ConvertBSTRToString(dstrText.CopyToBSTR());
if (strcmp(cmd, "給我上") == 0) shang();
else if (strcmp(cmd, "給我下") == 0) xia();
// ... 其他指令映射
break;
void shang() { // 向上移動
HWND win = FindWindowA("TXGuiFoundation", "QQ2013");
if (win) {
RECT rc; GetWindowRect(win, &rc);
SetWindowPos(win, NULL, rc.left, rc.top - 100, 300, 300, SWP_NOZORDER);
}
}
// 類似:xia(), zuo(), you(), openqq(), closeqq(), show(), hide()
我是學霸
清華土匪
傳智播客
天下無雙
給我上
給我下
給我左
給我右
打開企鵝
關閉企鵝
顯示
隱藏
譚勝是誰
你是誰
你是笨蛋
你是蠢豬
你很好
中秋快樂
同樣框架,將指令映射為 keybd_event / mouse_event 模擬鍵鼠:
if (strcmp(cmd, "旋風刀") == 0) {
keybd_event('A',0,0,0); keybd_event('A',0,KEYEVENTF_KEYUP,0);
keybd_event('D',0,0,0); keybd_event('D',0,KEYEVENTF_KEYUP,0);
keybd_event('W',0,0,0); keybd_event('W',0,KEYEVENTF_KEYUP,0);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
// 大風吹、充氣、跳躍、趴下、前進、後退 ...
sapi.lib、ole32.lib、comsupp.lib。er.xml 放置於可執行文件同目錄。SAPI 提供完整的 COM 介面實現語音命令控制。關鍵點:文法設計、消息驅動架構、指令到動作的映射。此類項目適合作為 C++ Windows 程式設計綜合練習。