最近本人正在准备CET-4的考试,从同学那得到了一份“四级高频词”的doc文档,该文档只有单词,并没有音标和解释,如果进行人工一个一个翻译很是费事,因此本人利用Delphi和金山词霸2002特别制作了一个单词批量翻译,并且可以将翻译结果直接保存为RTF文件的程序。其程序界面如下:

原理分析: 利用“金山词霸2002”的翻译功能,进行单词的翻译,利用Delphi获取“金山词霸2002”中翻译的结果的控件的句柄,利用粘贴复制功能,即可以获得翻译的结果了。
API函数说明: HWND FindWindow( LPCTSTR lpClassName, // 欲搜索的窗体的类名 LPCTSTR lpWindowName // 欲搜索的窗体的标题名称 );//查找与指定条件相符的第一个子窗口
HWND FindWindowEx( HWND hwndParent, // 在其中查找子的父窗口的句柄 HWND hwndChildAfter, // 从这个窗体后开始查找 LPCTSTR lpszClass, // 欲搜索的窗体的类名 LPCTSTR lpszWindow // 欲搜索的窗体的标题名称 );//在指定窗体列表中查找与指定条件相符的第一个子窗口
BOOL ShowWindow( HWND hWnd, // 窗体的句柄 int nCmdShow // 窗体的显示方式 );//指定窗口的可见性
BOOL BringWindowToTop( HWND hWnd // 窗体的句柄 );//将指定的窗口带至窗口列表的顶部
BOOL SetForegroundWindow( HWND hWnd //窗体的句柄 );//将窗口设为系统的前台程序
HWND SetFocus( HWND hWnd // 聚焦的窗体的句柄 );//将窗口聚焦
VOID keybd_event( BYTE bVk, // virtual-key code BYTE bScan, // hardware scan code DWORD dwFlags, // flags specifying various function options DWORD dwExtraInfo // additional data associated with keystroke );//模拟按键的产生
这里提供了基本Api的声明,具体的使用方法,你可以其它相关资料。
具体分析: 首先利用Spy++工具,对“金山词霸2002”进行分析,分析结果如下: 金山词霸2002的窗体的名称是:金山词霸 2002 金山词霸2002的单词输入控件类名:Edit (属于Combobox的子窗体) 金山词霸2002的翻译结果控件类名:XDICT_ExplainView
程序界面: 一个Timer控件(Timer1,其间隔时间为3秒),一个Memo控件(MList),两个RichEdit控件(RTrans,RConv),具体的代码如下:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,Forms, Dialogs, StdCtrls, ComCtrls, Clipbrd,Buttons, ExtCtrls, Menus;
type TForm1 = class(TForm) MList: TMemo; RTrans: TRichEdit; Button1: TButton; Timer1: TTimer; Button2: TButton; RConv: TRichEdit; Button3: TButton; od: TOpenDialog; RichEdit3: TRichEdit; MainMenu1: TMainMenu; F1: TMenuItem; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; C1: TMenuItem; N4: TMenuItem; N5: TMenuItem; RTF1: TMenuItem; Panel1: TPanel; ProgressBar1: TProgressBar; Splitter1: TSplitter; Splitter2: TSplitter; E1: TMenuItem; N6: TMenuItem; N7: TMenuItem; N8: TMenuItem; Edit1: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure N3Click(Sender: TObject); procedure N6Click(Sender: TObject); procedure N8Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; i:integer=0;//声明一个全局变量,用于单词的记数 implementation
{$R *.dfm}
//开始转换事件 procedure TForm1.Button1Click(Sender: TObject); begin RTrans.Clear;//清空转换区 RConv.Clear; timer1.Interval:=strtoint(edit1.Text)*1000;//设置间隔时间 timer1.Enabled :=true;// progressbar1.Position:=0;//设置进度条状态 i:=0;//初始化变量,用于记数 progressbar1.Max:=MList.Lines.Count; end;
procedure TForm1.Timer1Timer(Sender: TObject); var King,//金山词霸 2002 主窗口句柄 combo,//单词输入框父窗口句柄 edit,//单词输入框句柄 means:thandle;//翻译显示窗口句柄 begin if i<=MList.Lines.Count-1 then begin king:=findwindow(nil,pchar('金山词霸 2002')); combo:=findwindowex(king,0,'ComboBox',nil); edit:=findwindowex(combo,0,'Edit',nil); means:=findwindowex(king,0,'XDICT_ExplainView',nil); //信息显示 label3.Caption :='('+inttostr(i+1)+'/'+inttostr(MList.Lines.Count)+') '+MList.Lines[i]; //存储信息 clipboard.AsText := MList.Lines[i];
showwindow(king,sw_shownormal); bringwindowtotop(king); SetForegroundWindow(king); windows.SetFocus(edit); //模拟Ctrl+V 粘贴 keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0); keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
SetForegroundWindow(means); windows.SetFocus(means); //模拟Ctrl+A 全选 keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), 0, 0); keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
SetForegroundWindow(means); windows.SetFocus(means); //模拟Ctrl+C 复制 keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), 0, 0); keybd_event(Ord('C'), MapVirtualKey(Ord('C'), 0), KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
windows.SetFocus(RTrans.Handle ); //模拟Ctrl+V 粘贴 keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0); keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
RTrans.Lines.Add('=================='+#13); progressbar1.StepIt;//进度条移动 inc(i);//增加记数
end else begin timer1.Enabled :=false; RTrans.Lines.SaveToFile('Temp.txt'); end; end;
//读取单词列表到Mlist中 procedure TForm1.Button2Click(Sender: TObject); begin if od.Execute then MList.Lines.LoadFromFile(od.FileName ); end;
//转换功能,因为RTrans中得到的翻译中,音标还不可以正确的显示 //必须先安装金山词霸中的Font目录中的Phonetic Plain字体 //实现音标的正确显示 procedure TForm1.Button3Click(Sender: TObject); var i:integer; start,ends:integer; begin RConv.Clear; for i:=0 to RTrans.Lines.Count-1 do begin richedit3.Text :=RTrans.Lines[i]; start:=pos('[',richedit3.Text);//查找音标位置,音标在[]中 if start>0 then begin ends:=pos(']',richedit3.Text); richedit3.SelStart :=start; richedit3.SelLength :=ends-start-1; richedit3.SelAttributes.Name :='Kingsoft Phonetic Plain'; end; richedit3.SelectAll ; richedit3.CopyToClipboard ; RConv.PasteFromClipboard; application.ProcessMessages; end; end;
//程序退出 procedure TForm1.N3Click(Sender: TObject); begin application.Terminate ; end;
//复制 功能 procedure TForm1.N6Click(Sender: TObject); begin RConv.SelectAll ; RConv.CopyToClipboard; end;
//停止转换 procedure TForm1.N8Click(Sender: TObject); begin timer1.Enabled :=false; end;
end.
好了,到此为止,全部的程序就设计完毕了。
如何运行: 保证“金山词霸 2002”和该程序一起运行,如果你使用其他版本的词霸的话,请自行更改其中的查找句柄代码,以实现支持其他版本。 好了,我现在已经成功将这600个单词翻译完成,并用Word打印到纸上了,非常的快捷,如果你还有什么好的建议,欢迎回复!
如何获得编译好的可执行程序和源代码: 可以给我发电子邮件:[email protected] 或者登陆我的站点留言:http://redlegend.51.net

|