delphi中使用词霸2005的动态库XdictGrb.dll实现屏幕取词


本文整理自网络,侵删。

  近日来,在网上发现关于屏幕取词技术的捷径,搜索很长时间,发现实现方式以VB出现的居多,但是通过Delphi来实现的却好象没有看到,自己参考着VB的相关代码琢磨了一下通过delphi来实现的方式。 

其实也差不多,唯一不同的只有一个地方就是取词对象GrabProxy的AdviseGrab这个方法,该方法的参数是一个IXDictGrabSink 的接口类型,在Vb中是AdviseGrab(Me)就可以了,但是在delphi中则不能简单使用AdviseGrab(self)来,在前面 TForm1 = class(TForm)的这个Form类声明必须在继承一个接口才行,所以应该改成 TForm1 = class(TForm,IXDictGrabSink),然后实现IxDictGrabSink接口的方法QueryWord,该方法就是用来取词的。
function QueryWord(const WordString: WideString; lCursorX: Integer; lCursorY: Integer;
const SentenceString: WideString; var lLoc: Integer; var lStart: Integer): Integer;safecall;


此时你就可以通过类似于Vb中来进行指定了,AdviseGrab(self)就将接口指向了他自己。

但此之前,你必须先得到XDICTGRB_TLB单元,你可以通过delphi的
Project---->Import Type Library..来把该动态库引用进来,然后创建单元,或是简单的,你直接把他创建成一可用的控件。
然后在窗体中调用。

当成控件来使用如下:

直接拖到窗体上,然后将窗体代码中的TForm1 = class(TForm)改成

TForm1 = class(TForm,IXDictGrabSink),并且实现IXDictGrabSink接口中的方法的声明

function QueryWord(const WordString: WideString; lCursorX: Integer; lCursorY: Integer;
const SentenceString: WideString; var lLoc: Integer; var lStart: Integer): Integer;safecall;

然后在指定他的属性

GrabProxy1.GrabInterval := 1;//指定抓取时间间隔
self.GrabProxy1.GrabMode := XDictGrabMouse;//模式(鼠标是否加按键)
self.GrabProxy1.GrabEnabled := true;//是否有效
self.GrabProxy1.AdviseGrab(self);//接口指向自身

然后就是屏幕取词方法的实现

function TForm1.QueryWord(const WordString: WideString; lCursorX,
lCursorY: Integer; const SentenceString: WideString; var lLoc,
lStart: Integer): Integer;
begin
//Label1是当前鼠标的位置,Lcursorx,LCursorY表示鼠标的位置
Label1.Caption := '(' + inttostr(lCursorX) + ',' +inttostr(lCursorY) + ')';
//Label2是当前鼠标指向的位置的字符串,保留在(SentenceString)中
Label2.Caption := '当前语句:' + SentenceString ;
//Lloc鼠标在语句中的位置 ,label3得到当前字符串
Label3.Caption := '当前字符:' + Midstr(SentenceString,lloc+1,1);
end;

方法二:不使用控件,通过使用createOleObject(str)函数来实现动态创建该取词对象

同样引用OleServer, XDICTGRB_TLB两个单元,然后

TForm1 = class(TForm)改成

TForm1 = class(TForm,IXDictGrabSink),并且实现IXDictGrabSink接口中的方法的声明

之后声明变量Gp: variant;

在窗体的Show中写代码如下:

procedure TForm1.FormShow(Sender: TObject);
var
i: IXDictGrabSink;
begin
//声明一个接口变量,然后把自己赋给该变量以便后面的方法调用接口
i := self;
//创建对象
gp := CreateOleObject('XdictGrb.GrabProxy');
//指定属性
gp.GrabEnabled := true;
gp.GrabInterval := 1;
gp.GrabMode := XDictGrabMouse;
gp.AdviseGrab(i);
end;

然后实现接口的取词方法。

注意:在窗体的Close事件中要写上 gp := 0;将创建的取词对象释放掉,否则窗体关闭的时候会出错哦!

相关阅读 >>

Delphi 10.3.x与android 10兼容性的问题

Delphi获取各种编码的识别符

wmi使用的win32_类库名

Delphi 如何在tmemo,tedit或trichedit中获得插入符的位置

Delphi winapi: settimer、killtimer - 创建与移除高性能定时器

Delphi 简单的登录窗口

Delphi 以低用户权限启动一个进程.比如vista或者win7中的ie

Delphi 过滤网页代码 <script></script>

Delphi webbrowser 查找对话框

怎样在Delphi中屏蔽flash控件的右键弹出菜单

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



打赏

取消

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

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

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

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

评论

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