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


本文整理自网络,侵删。

 本人利用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打印到纸上了,非常的快捷,如果你还有什么好的建议,欢迎回复!
来源:http://bigpower.blog.51cto.com/209892/69332

相关阅读 >>

Delphi关于邮箱收信的问题

Delphi中move 函数额用法

Delphi10.2.3实现http异步下载

Delphi 截取两个字符之间的内容

Delphi 让程序自己更新本程序

Delphi实现url编码解码函数

Delphi @ 与 ^ 运算符

Delphi命令行窗口实现9*9乘法表

print documents from Delphi - print pdf, doc, xls, html, rtf, docx, txt

Delphi 反转内存的函数

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...