好几天没有发帖子了,对不起各位支持我的朋友! // bow
因为这几天工作终于有了着落,在据了2个offer后,终于又收到了
一个不错的offer,难道是事不过三?不过同时还有一个很有希望、
也是我更加心仪的公司,现在正在催他们索取最后的结果。请大家
不要说我骑驴找马啦(幸好,驴也是一头好驴)。
奉上一篇《金山词霸词库读取程序补充》。
发表了《金山词霸词库读取程序》后,得到了不少朋友的支持。在那篇文章的
最后,我给自己提出了一个更加高的要求:如何读取单词的解释?因为直接使用
GetWindowText()是得不到的(原因未知)。昨天,我按照自己原来提出的思路
进行了这个工作:获取单词解释窗口的句柄,发送Ctrl+A和Ctrl+C,然后从剪贴板中读取。
1:使用Spy++跟踪单词解释窗口,跟踪Ctrl+A和Ctrl+C的消息,发现Ctrl+A有4个
消息:WM_KEYDOWN,WM_KEYDOWN,WM_KEYUP,WM_KEYUP。
2:程序中使用和读取单词解释一样的循环,不过不是使用GetWindowText(),而是向
窗口发送消息,但是...失败!不知道为什么,我发送4个消息后,会自动产生一个WM_CHAR
消息。实际上,WM_CHAR就是由WM_KEYDOWN和WM_KEYUP自动生成。于是我使用了SendMessage()
这样就会把自动生成的WM_CHAR消息延迟到我们发送的4个消息的最后,但是仍然无法从剪贴板
中得到数据。
3:放弃了发送键盘消息欺骗窗口的做法。换一种思路:用户可以使用鼠标右键菜单,选择“全选”;然后再使用鼠标右键菜单,选择“复制”,同样可以实现Ctrl+A和Ctrl+C的功能。嗯,听起来不错!
4:如何知道菜单项的菜单ID?相信许多朋友也做过:使用VC打开金山词霸的主程序:xdict.exe,
记住在打开文件窗口的“Open As”中选择“Resources”,即以资源方式打开,我们就可以看到
xdict.exe的资源了!可以知道:32791是“全选”的菜单ID,32775是“复制”的菜单ID。
5:修改程序,对每一个单词,向单词解释窗口发送32791和32775的WM_COMMAND的消息,结果...
剪贴板中还是没有数据。
6:其实没有太大的问题了:再次使用Spy++跟踪,发现这2个消息实际上是发送给金山词霸的主窗口,而不是直接发送给单词解释窗口的。OK,不用我多说了吧!
最后给出代码:
最后的讨论:
1:原来以为程序会把单词读取慢很多,实际也只慢了一倍左右(用时2个半小时)。:)
2:加快一点速度:不是每次读取解释后,就写入文件。建立一个内存缓冲,比如100K,每次读满
buffer后才写文件,应该可以加快一点速度。不要忘记最后关闭文件前也要把buffer的数据写入。
3:如何读取详细的解释?选择一个单词后,按<回车>键或者双击,单词解释窗口可以显示很长的
详细解释。这个工作会更加麻烦一点了,暂时我不再研究了(这次是真的!)。
注意:程序运行过程中,千万不要在其它程序中使用Ctrl+C,Ctrl+X的功能!!!
我写下此文时,无意中使用了一次Ctrl+C,结果粘贴时出来了某个单词的解释!看来
可能有某个单词的解释被我的Ctrl+C覆盖了!痛苦!程序运行需要2个半小时,以后
发现了哪个单词的解释有问题再修改吧!