读出qq信息需要涉及到几个问题:
1、就是要利用到microsoft speech sdk 5.1开发包做为文本语音的转换
2、就是如何提取出qq窗口中需要的信息
首先需要把qq信息设定为自动弹出
这样程序可以动态地捕捉到弹出的qq窗口
为其分别开起一个发声线程,或者把信息加到特定的信息队列以便依次读出
HWND g_hParantWnd = ::FindWindow(NULL, "查看消息"); if (g_hParantWnd ) { m_client=AfxBeginThread(RUNTIME_CLASS ( CServerThread),THREAD_PRIORITY_ABOVE_NORMAL,0,0,NULL ); ((CServerThread*)m_client)->ThreadProc (g_hParantWnd); ThreadProc,&g_hParantWnd, CREATE_SUSPENDED,NULL); } |
另外需要说明的是各个重要的信息窗口的id号
HWND hChildQQCode = ::GetDlgItem(g_hParantWnd, 223);//发信人的id HWND hChildQQName = ::GetDlgItem(g_hParantWnd, 285);//发信人的昵称 HWND hChildQQTime = ::GetDlgItem(g_hParantWnd, 1078);//发信时间 |
但是更重要的是文本信息窗口,文本信息窗口采用的是CRichEditCtrl形式
因此需要绑定工作
HWND hWnd = ::FindWindowEx(g_hParantWnd, NULL, "AfxWnd42", NULL); HWND hChildQQText = ::GetDlgItem(hWnd, 896);//文本的id
CRichEditCtrl x; x.Attach(hChildQQText);//绑定 int nLineCount = x.GetLineCount(); for ( int j=0; j { x.GetLine(j, Text, 255); list->InsertString (i++,Text); str.Format ("%s",Text); pSpVoice->Speak(str.AllocSysString(), SPF_DEFAULT, NULL);
//调用microsoft speech sdk接口
} x.Detach(); ::SendMessage(g_hParantWnd, WM_CLOSE, 0, 0);//关闭qq消息框 |
至于microsoft speech sdk 5.1的调用,基本上就是对其com特定接口函数的操作
首先包含
#include
#include
ISpObjectToken * pSpObjectToken ; |
pSpObjectToken = NULL; if (FAILED(CoInitialize(NULL))) { AfxMessageBox("Error to intiliaze COM"); return false; }
pSpVoice = NULL; HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pSpVoice); SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"language=804", NULL, &pSpObjectToken));//804为中文语音 pSpVoice->SetVoice(pSpObjectToken); |
之后就可以如先前代码中的
pSpVoice->Speak(str.AllocSysString(), SPF_DEFAULT, NULL);
读取相应的信息了。
通过以上的操作,完全可以做一款,对qq信息的分离提取,并加入语音的小软件
适合于在主人不在时信息的记录,或主人做其他事情而不能留意显示器时,可以自动地为之读出需要的信息。
以上内容出于自娱自乐,希望老师们多多指导,谢谢 
|