天天看點

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接口中的方法的聲明

                       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)改成

之後聲明變量Gp: variant;

在窗體的Show中寫代碼如下:

procedure TForm1.FormShow(Sender: TObject);

var

  i: IXDictGrabSink;

   //聲明一個接口變量,然後把自己賦給該變量以便後面的方法調用接口

   i := self;

   //建立對象

   gp := CreateOleObject('XdictGrb.GrabProxy');

   //指定屬性

   gp.GrabEnabled := true;

   gp.GrabInterval := 1;

   gp.GrabMode := XDictGrabMouse;

   gp.AdviseGrab(i);

然後實作接口的取詞方法。

注意:在窗體的Close事件中要寫上 gp := 0;将建立的取詞對象釋放掉,否則窗體關閉的時候會出錯哦!

本文轉自 不得閑 部落格園部落格,原文連結:http://www.cnblogs.com/DxSoft/archive/2010/01/01/1637652.html   ,如需轉載請自行聯系原作者

繼續閱讀