WEB开发网
开发学院软件开发Delphi 利用Delphi和金山词霸制作批量单词翻译 阅读

利用Delphi和金山词霸制作批量单词翻译

 2006-02-04 13:54:42 来源:WEB开发网   
核心提示:最近本人正在准备CET-4的考试,从同学那得到了一份“四级高频词”的doc文档,利用Delphi和金山词霸制作批量单词翻译,该文档只有单词,并没有音标和解释,并用Word打印到纸上了,非常的快捷,如果进行人工一个一个翻译很是费事,因此本人利用Delphi和金山词霸2002特别制作了一个单词批量翻译
最近本人正在准备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打印到纸上了,非常的快捷,如果你还有什么好的建议,欢迎回复!

如何获得编译好的可执行程序和源代码:
  可以给我发电子邮件:redlegend@163.com
  或者登陆我的站点留言:http://redlegend.51.net

Tags:利用 Delphi 金山

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接