近日來,在網上發現關于螢幕取詞技術的捷徑,搜尋很長時間,發現實作方式以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 ,如需轉載請自行聯系原作者