最近本人正在准备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); [1] [2] 下一页 没有相关教程
|