常常看英文网页. 有不少单词不认识, 甚至不知道如何发音. 也有软件可以翻译. 比如 googletoolbar, 还支持屏幕取词. 而金山词霸的一些版本也可以发音. 但它太庞大了. 我只要一个小小的发音功能. 犯不着. 这个时候, 往往我将这个词粘贴到控制面板的 speech applet, 让 windows 给我读出来. 虽然声音很糟糕. 毕竟是免费的午餐. 至少能知道单词是怎么读的.
这个操作虽然简单. 但次数一多, 就有些厌烦了. 因此, 就有了写一个 IE 插件的想法. 比如选中一个单词. 点击工具栏上的一个按钮. 电脑就帮你读出来. nice idea!
有两个问题需要解决.
. 怎么使用微软的 speech.
. 怎么创建 Internet Explorer 插件.
对于第一个问题. 我找到了 Microsoft Speech SDK 5.1, 居然是微软 2001 年发布的. 还是使用经典的 COM, 没有 .NET 这么先进. 附带了不少例子. 其中的 TalkBack 是一个简单的 console 程序. 先识别语言. 然后再读出来. 而我只需要读出来 (Text To Speech). 就在这个例子上面修改吧. 几行代码就可以高定. 如下:
CComPtr<ISpVoice> cpVoice;
hr = cpVoice.CoCreateInstance(CLSID_SpVoice);
if (SUCCEEDED(hr))
{
cpVoice->Speak( L"What can I say?", SPF_DEFAULT, NULL);
}
第二个问题费了一些时间. 首先我想到的就是 IE toolbar, IE toolbar 现在的名气很大. 很多流氓软件都用这个. 在 IE 上增加一个工具栏, 可以加上想要的通用控件, 比如工具栏按钮什么的. 但没有告诉我如何获取网页上选中的文本. 然后我又找到了 BHO. 也是一个 in-proc COM 组件. 通常没有界面. 还有一篇很好的文章介绍这个:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwebgen/html/bho.asp
Browser Helper Objects: The Browser the Way You Want It
还提供了例子代码. 加上另一篇文章:
http://www.cnblogs.com/hbifts/articles/24265.html
VC++开发BHO插件——定制你的浏览器
另外, 还找到了一个如何从网页获取选中文本的脚本. 就是这么简单:
document.selection.createRange().text;
其中的 document 是 dhtml 中的文档对象. 我要做的只是把它翻译程 C++. 就象这样(为了简洁, 去掉了错误处理):
mWebBrowser2->get_Document(&pDisp);
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spHTML = pDisp;
if (spHTML)
{
CComPtr<IHTMLSelectionObject> selectObj;
spHTML->get_selection(&selectObj);
if (selectObj)
{
CComPtr<IDispatch> iDispRange;
selectObj->createRange(&iDispRange);
CComQIPtr<IHTMLTxtRange> range(iDispRange);
if (range)
{
BSTR bstrSelection;
range->get_text(&bstrSelection);
mcpVoice->Speak(bstrSelection, SPF_ASYNC, NULL);
}
}
}
有了这些. 已经可以实现我的想法了.
于是, 就有了这个 narrator.dll. 在 IE 里遇到不知道如何读的单词. 选中它. 然后按 F2 (预定义的快捷键), 电脑就会读出这个单词.
Known Problems:
. 基于 Microsoft 的语言引擎, 只要 xp 及其以上采用安装, 所以, 默认情况下, 只支持 xp (极其以上)
. 默认情况下, 不支持中文阅读
. 如果您选中了一大段英文文本, 他会一直念到最后. 不能中断
. 还不能自定义键(偷懒)
Un/Installation:
. 拷贝到 windows 目录. 然后在开始/运行 执行 regsvr32 narrator.dll 来安装.
. 卸载: 在开始/运行 执行 regsvr32 /u narrator.dll, 然后删除 windows 目录的 narrator.dll. 绝对没有残留.
http://nicoster.googlepages.com/narrator.rar
如果只要求右键菜单触发, 那么就忘掉上面说得那么多吧. no ATL, no C++, just scripts
注意注册表文件的路径, 这里假设你把 narrator.thm 放到了 d:/
http://nicoster.googlepages.com/narrator_setup.rar
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1427932