Microsoft Agent 學習筆記 (一) (轉)

worldblog發表於2007-12-09
Microsoft Agent 學習筆記 (一) (轉)[@more@]

 

    Agent 學習筆記 (一):namespace prefix = o ns = "urn:schemas-microsoft-com::office" />

  Microsoft A是一組可的服務, 用來管理一些角色(Character),這些角色透過動畫、

來同交流,使用最新的技術,他們甚至可以聽懂人的話,也就是說,使用者可以用聲音控制他們,

這使得應用的操作方式更符合人的行為方式。

  雖然Microsoft對於Agent最成功的使用是Office Asistant, 它用來提供上下文幫助和使用嚮導,但是可以把

Agent使用在任何地方,譬如一般的應用程式和遊戲中。在本文和後面的文章中,我將簡單的介紹一下它的使用。

  MS Agent包含了一組,它們分別是Request, Agent(control), Characters (collection), Character,

Commands(collection),Command,Balloon,AnimationNames(collection),SpeechInput,AudioOutput,CommandsWindow,

PropertySheet。本篇先介紹Agent(control), Characters(collection), Request三個物件,其他物件以後再作介紹。

  MS Agent元件包含了一組物件,它們分別是Request, Agent(control), Characters (collection), Character,

Commands(collection),Command,Balloon,AnimationNames(collection),SpeechInput,AudioOutput,CommandsWindow,

PropertySheet。本篇先介紹Agent(control), Characters(collection), Request三個物件,其他物件以後再作介紹。

  Agent(control)--透過它,我們可以訪問到Microsoft Agent支援的大部分物件和事件。它有幾個重要的屬性和方法,

包括:Connected屬性, Characters屬性。

unit AgentDemo;

uses

  Agents_TLB; //引用匯入的TypeInfo unit

 

const

RequestSuccesully = 0

RequestFailed = 1;

  RequestPending = 2;

  RequestInterrupted = 3;

  RequestInProgress = 4;

 

var

  Agent1: TAgent; //宣告TAgent型別的變數Agent1

  IAgnt: IAgentCtlEx;

  Merlin: IAgentCtlCharacterEx;

  IReq: IAgentCtlRequest;

 

begin

  Agent1 := TAgent.Create; 

  IAgnt := Agent1.ControlInterface;  //取得IAgentCtlEx介面

  IAgnt.Connected := True;   //連線到Microsoft Agent Server

  IReq := IAgnt.Characters.Load('Merlin', 'Merlin.acs');  //載入Merlin角色

  Merlin := IAgnt.Characters.Character('Merlin');  //取得Merlin的Character介面

  Merlin.Show(False);  //顯示Merlin

  IReq := Merlin.Play('Congratulate_2');  //讓Merlin鼓掌

  if IReq.Status <> RequestSuccessfully then  //判斷Merlin當前的狀態,如果鼓掌動畫//還沒有完成就停掉它

  Merlin.Stop;

  Merlin.Speak('Hello, guys', '');  //讓Merlin說話

  Merlin.H;  //隱藏Merlin

  IAgnt.Characters.Unload('Merlin');  //解除安裝Merlin

  IAgnt.Connected := False;  //與Microsoft Agent Server斷開連線

  Agent1.Free;

end;

說明:Request Object用來同步對Character的訪問,對Character的訪問,如Load, Get, Play, Speak都會產生一個Request,

IAgentCtlRequest的Status屬性有五個值,分別是

  0:請求已經完成

  1:請求失敗

  2:請求已經提交,但是還沒有完成

  3:請求被中斷

  4:請求正在處理

Request物件在上面的程式中的作用就是強制Merlin停止鼓掌說話,你也可以用在多個Character的程式碼中,例如:讓多個Character

 

procedure WaitFor(AReq: IAgentCtlRequest);

  var

  Status: LongInt;

begin

  if AReq <> nil then

repeat

   Application.ProcessMessages;

   Status := AReq.Get_Status;

   until (Status <> RequestPending) and (Status<>RequestInProgress)

  end;

  end;

 Req := Merlin.Speak('Hello, Monkey King','');

  WaitFor(Req);

  Req := MonkeyKing.Speak('Hello, Merlin','');

  WaitFor(Req);

  Req := Merlin.Speak('Byebye, Monkey King', '');

  WaitFor(Req);

  Req := MonkeyKing.Speak('bye', '');

上面的程式使用的是early binding, 需要import MS Agent 2.0的TypeInfo, 如果使用late binding,則可以這樣

uses

  ComObj;

var

  vAgent: OleVariant;

  Merlin: OleVariant;

  Req: OleVariant;

begin

  vAgent := CreateOleObject('Agent.Control.2');

  vAgent.Connected := True;

  Req := vAgent.Characters.Load('Merlin', 'Merlin.acs');

  Merlin := vAgent.Characters.Character('Merlin');

  Req := Merlin.Show(False); 

  WaitFor(Req):

  Req := Merlin.Play('Congratulate_2'); 

  WaitFor(Req);

  Merlin.Speak('Hello, guys', ''); 

  Merlin.Hide; 

  vAgent.Characters.Unload('Merlin'); 

  vAgent.Connected := False; 

end. 

不過速度上面會慢,因為涉及到介面的多次查詢和轉換

以上程式碼只是簡單的演示和說明,只能作為參考。

以上技術資料可以參考  <>  Eric Harmon

  MSDN----&gtPlatfoSDK--&gtUser Interface Services--&gt Microsoft Agent

  必要的準備:因眾多語言中,本人只略懂Delphi, 所以所有的思路及程式程式碼都以Object Pascal描述,因此

讀者應具備一定的Object Pascal基礎和Delphi使用。另外由於MS Agent包含有一組元件,要執行程式,

也必須先在本地計算機上面Microsoft Agent 2.0。Microsoft Agent 2.0和角色請至。本文

所有的源程式可以發信至lukejee@263.net向我索取。

  Luke Jee

   2001.11.22


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990491/,如需轉載,請註明出處,否則將追究法律責任。

相關文章