最近本人正在準備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),具體的代碼如下:
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