#define SPCAT_VOICES           L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices"
#define SPKEY_ATTRIBUTES         L"Attributes"
#define SPVALUE_LANGUAGE         L"Language"
BOOL CActionCenter::InitializeSAPI()
{
      ReleaseSAPI();
      HRESULT hr;
      hr = m_cpVoice.CoCreateInstance( CLSID_SpVoice );
      if(hr == S_OK)
      {
            ISpObjectToken * pToken;        // NOTE:  Not a CComPtr!  Be Careful.
            CComPtr<IEnumSpObjectTokens> cpEnum;
            hr = SpEnumTokens(SPCAT_VOICES, L"", L"", &cpEnum);
            if (hr == S_OK)
            {
                  bool fSetDefault = false;
                  while (cpEnum->Next(1, &pToken, NULL) == S_OK)
                  {
                        //CSpDynamicString dstrDesc;
                        //hr = SpGetDescription(pToken, &dstrDesc);
                        //if (SUCCEEDED(hr))
                        {
                              m_vecISpToken.push_back(pToken);
                        }
                  }
                  return (m_vecISpToken.size() > 0);
            }
      }
      return FALSE;
}
void CActionCenter::ReleaseSAPI()
{
      vector<ISpObjectToken*>::iterator it;
      for(it=m_vecISpToken.begin(); it!=m_vecISpToken.end(); ++it)
      {
            (*it)->Release();
      }
      m_vecISpToken.clear();
}
void CActionCenter::SetVoice(LANGID lid)
{
      vector<ISpObjectToken*>::iterator it;
      WCHAR wstrLangID[32] = {0};
      swprintf(wstrLangID, L"%X", lid);
      for(it=m_vecISpToken.begin(); it!=m_vecISpToken.end(); ++it)
      {
            ISpObjectToken *pToken = (*it);
            ISpDataKey *pSpDataKeyAttributes = NULL;
            HRESULT hr = pToken->OpenKey(SPKEY_ATTRIBUTES, &pSpDataKeyAttributes);
            if(SUCCEEDED(hr))
            {
                  WCHAR *wstrLanguageID = NULL;
                  hr = pSpDataKeyAttributes->GetStringValue(SPVALUE_LANGUAGE, (WCHAR**)&wstrLanguageID);
                  if(SUCCEEDED(hr))
                  {
                        if(wcsstr((BSTR)wstrLanguageID, (BSTR)wstrLangID))
                        {
                              m_cpVoice->SetVoice(pToken);
                              break;
                        }
                  }
                  pSpDataKeyAttributes->Release();
            }
      }
}

最新文章

  1. gRPC .NET Core跨平台学习
  2. linux 最小安装 需要的后续操作
  3. string.Format格式化
  4. 有些网站为什么要使用CDN,CDN又是什么呢
  5. PLSQL_查询已执行SQL的绑定参数(案例)
  6. 封装SqliteHelper类--Sqlite数据库
  7. Linux报too many open files的解决方案
  8. 在Xbox和Hololens 上部署、调试UWP App
  9. MySQL Sniffer
  10. 学习MVC之租房网站(三)-编写实体类并创建数据库
  11. TLS1.0和TLS1.1的区别
  12. java oop详解
  13. phone number
  14. 全志A33 lichee 搭建Qt App开发环境编写helloworld
  15. Cracking The Coding Interview 9.1
  16. Piwik学习 -- 插件开发
  17. 代码:PC 链接列表面板border的一种做法(每行之间有分割线)
  18. eclipse gradle插件 org.gradle.tooling.GradleConnectionException: Could not install Gradle distribution from &#39;https://services.gradle.org/distributions/gradle-3.4-bin.zip&#39;.
  19. swiper跳转制定页面
  20. centos下gitlab私服完整安装部署(nginx+MySQL+redis+gitlab-ce+gitlab-shell+)

热门文章

  1. 【WPF学习笔记】之如何点击“新建”按钮,在面板中加载一条条的“用户控件”的信息:动画系列之(四)
  2. cocos2d-x 下使用加密 sqlite3
  3. php类中const
  4. webpy使用mysql数据库操作(web.database)
  5. mongo 介绍
  6. springcloud微服务实战--笔记--1、基础知识
  7. Tomcat学习笔记【3】--- Tomcat目录结构
  8. VirtualBox创建VM结果ProcessorType是空的
  9. c语言高速推断一个数是偶数还是奇数
  10. imagick图片压缩。