Session D-HELP

Einbindung von Hilfe mit den Microsoft Agents

Nathalie Mengel


Einleitung

Ein gutes Hilfesystem spart so manchen Hotline-Anruf und ist mittlerweile Voraussetzung für die Akzeptanz unserer Programme beim Benutzer. Microsoft Agents (entsprechen in etwa den Office-Assistenten) ermöglichen die Darstellung von interaktiv animierten Figuren. Die Agents sind eine Bereicherung für jede Hilfe, denn sie bil­den eine natürliche und unterhaltsame Möglichkeit, Informationen zum Programm darzustellen. Dieser Artikel gibt einen Überblick über MS Agents, was man benötigt, um die Agents in eigene Anwendungen einzubinden, und wie die Steuerung der Agents funktioniert.

Microsoft Agents

Was sind Microsoft Agents?

Microsoft Agent ist eine Zusammenstellung von programmierbaren Software-Diensten und Tools, welche die Darstellung interaktiv animierter Figuren ermöglichen (Anm.: Bisher habe ich keine akzeptable Übersetzung von Microsoft für die Agent-Figuren gefunden. Im Office werden sie als „Assistenten“ bezeichnet, aber dieser Begriff ist bereits als Übersetzung von Wizards belegt. Ich benutze deshalb in diesem Dokument möglichst durchgängig den englischen Begriff „Character“.). Man kann sie als Bereicherung für WebSites und Programme nutzen, indem man sie als interaktive Assistenten einbaut. Dort können die Character z.B. eine Einführung über das Programm geben, den Benutzer über mehrere Schritte leiten oder auch einfach nur unterhalten. Microsoft stellt vier Stan­dard-Character zur Verfügung, die von Client-Anwendungen verwendet werden können:


      Abbildung 1: Genie, Merlin, Peedy und Robby

Microsoft Agent ermöglicht es dem Entwickler, seine Programme mit einer neue Form der Benutzerinteraktion zu versehen. Dies wird auch als „conversational interface“ bezeichnet, das die menschliche Kommunikation möglichst genau nachbildet. Microsoft Agent enthält zusätzlich zu den üblichen Maus- und Tastatur-Steuerungsmechanis­men auch eine Spracherkennung , so dass die Anwendung auf Sprachkommandos reagieren kann. Die Character des Microsoft Agents antworten durch synthetisierte Sprache, Audiofiles (.wav) und über eine Textausgabe, die wie bei Comics in einer Sprechblase dargestellt wird.

Die Programmierschnittstelle der Microsoft Agents macht es einem recht leicht, die Character zu steuern, so dass sie auf Benutzereingaben reagieren. Die Character erscheinen in ihrem eigenen unsichtbaren Fenster, so dass sie an jeder Stelle des Bildschirms positioniert werden können. Microsoft Agents sind Mehr-Bildschirm-fähig. Zu den Entwicklungstools der Microsoft Agents gehört ein ActiveX Control, das man z.B. über VB, VBScript, Java, C++ und Visual FoxPro einfach ansprechen kann. Die meisten Beispiele findet man unter Visual Basic, was für den VFP-Programmierer aber dank der einfachen Lesbarkeit selten problematisch sein sollte.

Microsoft Agent verfügt nicht über die IntelliSense-Funktion der Office-Assistenten, die versuchen, anhand der Benutzereingaben schon im voraus passende Hilfetexte oder Tipps zu finden. Es gibt mittlerweile allerdings diverse Drittanbieter, die auch solches leisten.

Installation

Für die Nutzung der Microsoft Agent Services werden die in der Tabelle aufgeführten Komponenten benötigt. Sie befinden sich im MSAgent Software Development Kit. Das SDK ist auf der Konferenz-CD vorhanden, unter www.microsoft.com/msagent downloadbar und mit gedruckter Dokumentation bei MS Press erhältlich. Da Microsoft Agent’s Komponenten einen Teil des Betriebssystems darstellen, können sie nicht wieder deinstalliert werden.

Folgende Komponenten werden benötigt (optionale Komponenten sind grau hinterlegt):

Komponente

Installationsdatei

Beschreibung

Microsoft Agent Core Components

\msagent.exe

Enthält den Agent Server, das ActiveX-Control und das MS Speech Application Programming Interface (SAPI). Muss unbedingt auf dem Ziel­rechner installiert sein.

Microsoft Agent Character Files

\chars\*.exe

Installiert die Character. Diese werden im Ver­zeichnis %SystemDir%\MSAgent\Chars\ als *.acs abgelegt. Die Character-Daten werden dynamisch geladen und können so auch z.B. für WebSites nachgeladen werden.

Lernout & Hauspie® TruVoice Text-To-Speech Engine

\speech\tv_enua.exe

Text-To-Speech Engine, die die Sprachausgabe ermöglicht.

International Text-To-Speech-Engines

\speech\lhtts***.exe

Die TTS-Engine für deutsche Sprache wird über die Datei lhttsged.exe installiert.

Microsoft Agent Language Components

\intl\agtx****.exe

Die DLL für deutsche Sprache wird über die Datei agtx0409.exe installiert.

Speech Control Panel

\speech\spchcpl.exe

Installiert sich in der Systemsteuerung. Mit diesem Tool kann man die Sprachausgabe feintunen (z.B. die Sprachgeschwindigkeit der Standardstimmen ändern).

Microsoft Speech Recognition 
Engine

\speech\actcnc.exe

Spracherkennungs-Engine. Damit kann der Character gesprochene Befehle erkennen.

Microsoft Agent Character Editor

\sdk\ace.exe

Editor zum Erstellen neuer Character.

Microsoft Office Palette

\sdk\assistpalet.bmp

Es wird empfohlen, diese Palette bei der Erstellung neuer Character zu benutzen.

Microsoft Agent Linguistic Information Sound Editing Tool

\sdk\liset.exe

Tool zum Erstellen phonetischer Informationen für WAV-Dateien. Damit wird die Lippen-Synchroni­sation der Character optimiert.

Das Agent-Control Objektmodell

Überblick

Das MS Agent ActiveX Control bietet eine Programmierschnittstelle, die von VFP aus genutzt werden kann. Das Object Model des Agent Controls ist entsprechend folgender Graphik hierarchisch aufgebaut (gepunktete Linien bedeuten, dass davon mehrere Objekte existieren können):

Das Request Objekt

Der MS Agent Server arbeitet in den meisten Fällen asynchron. Dadurch läuft die eigene Anwendung einfach weiter, während der Server noch damit beschäftigt ist, das aufgerufene Kommando auszuführen (z.B. eine Cha­racter-Animation abzuspielen). Über Request-Ojekte kann der Status für eine bestimmte Aktion abgefragt wer­den. Dies ermöglicht das sequentielle Abarbeiten von Aktionen, so dass man Aktionen des MS Agent und des Anwendungsprogramms synchronisieren kann.

Das Agent Control

Das Agent Control ist die Schnittstelle zum Agent Server. Über das Agent Control kann man auf Events und die meisten anderen Objekte des Microsoft Agent Servers zugreifen (siehe Hierarchie-Grafik). Das Agent Control verfügt auch über eigene Eigenschaften, die angesprochen werden können.

Das Characters Collection Objekt

Das Characters Objekt ist eine Collection der geladenen Character Objekte. So kann man in einer Anwendung mehrere Character laden und steuern. Man spricht das einzelne Character Objekt als Item in der Characters Collection an.

Das Character Object

Ein Character ist ein Objekt der Characters-Collection. Man lädt einen bestimmten Character (z.B. Peedy) in die Characters Collection. Die einzelnen Characters werden über die Collection angesprochen und verfügen über eigene Methoden und Eigenschaften.

Das Commands Collection Objekt

Man kann in der Client-Anwendung eigene Kommandos definieren. Diese werden in der Commands Collection abgelegt. D.h., dass diese Befehle nur aufgerufen werden können, wenn die Client-Anwendung aktiv ist, die diese Befehle definiert hat.

Das Command Objekt

Ein Command Objekt ist ein Item in der Commands Collection. Der Server stellt den Zugriff auf die Command Objekte einer Anwendung zur Verfügung, sobald die Client-Anwendung die aktive Anwendung für Benutzer­eingaben ist. Um auf ein Command Objekt zuzugreifen, gibt man seinen Namen als Referenz in der Commands Collection an.

Der Benutzer kann ein Command Objekt über das Pop-up-Menü des aktiven Characters oder über das Sprach­eingabe Fenster aufrufen. Um einen Befehl im Pop-up-Menü sichtbar zu machen, muss die Eigenschaft "Visible" des entsprechenden Command Objekts gesetzt sein. Um im Spracheingabe-Fenster zu erscheinen, müssen die Eigenschaften "VoiceCaption" und "Voice" gesetzt sein.

Das Balloon Objekt

Wie in einem Comic stellt das Balloon Objekt die vom Character gesprochenen Worte (Methode "Speak") als Sprechblase und die gedachten Worte (Methode "Think") als "Denkblase" dar.

Das AnimationNames Collection Objekt

Die AnimationNames Collection enthält eine Liste der Namen für die Animationen, die für einen Character ver­fügbar sind. Über diese Collection kann man feststellen, welche Animationen von einem bestimmten Character unterstützt werden.

Das AudioOutput Objekt

Über das AudioOutput Objekt kann man auf die Audio Eigenschaften des Servers zugreifen. Die Eigenschaften sind für den Client Read-Only, können lediglich vom Benutzer über das Eigenschaftsfenster des Agents geändert werden.

Das SpeechInput Objekt

Über das SpeechInput Objekt erhält man Zugriff auf die Spracheingabe Eigenschaften des MS Agent Servers. Die Eigenschaften sind für die Client-Anwendung Read-only , können lediglich vom Benutzer über das MS Agent Eigenschaftsfenster geändert werden. Voraussetzung ist, dass eine Sprachengine installiert und aktiviert ist.

Das CommandsWindow Objekt

Über das CommandsWindow Objekt erhält man Zugriff auf die Eigenschaften des Spracheingabe-Fenster (Voice Commands Window). Das Spracheingabe-Fenster ist eine gemeinsam genutzte Ressource, über die der Benutzer die Commands sehen kann, die über Spracheingabe aufgerufen werden können. Wenn die Spracherkennung deaktiviert ist, zeigt das Spracheingabe-Fenster den Text "Speech input disabled" an, und zwar in der Sprache des aktiven Characters.

Das PropertySheet Objekt

Über das PropertySheet Objekt können einige Eigenschaften des Characters geändert werden.

Agents programmieren: Grundlagen

Eine Instanz des Agent-Controls erzeugen

Der MS Agent Server ist ein COM-Server. Um ihn ansprechen zu können, muss die Client-Anwendung zunächst eine Connection zum Server aufbauen. Dies kann zur Laufzeit programmatisch über die Standard COM Schnitt­stellen des MS Agent Servers geschehen. Oder man nutzt einfach das mitgelieferte ActiveX-Control und fügt dieses während des Designs in die Anwendung ein. Sobald man eine Instanz des Controls hat, kann man darüber nicht nur auf die Eigenschaften des Controls selbst, sondern auch auf die der untergeordneten Objekte zugreifen.

Wenn man das ActiveX Control zur Designzeit nutzen möchte, fügt man es zur Form hinzu, z.B. indem man das ActiveX Steuerelement (OleControl) aus der Toolbar für Formular-Steuerelemente auf die Form zieht. Daraufhin wird der Dialog "Objekt einfügen" angezeigt, in dem man das Microsoft Agent Control 2.0 als Steuerelementtyp auswählt.


Abbildung 2: Das ActiveX Control zur Form hinzufügen

Schon kann man über das Eigenschaftsfenster auf Eigenschaften und Events des Agents zugreifen:

 
Abbildung 3: Das ActiveX Control im Form-Designer

Das Control wird zur Laufzeit instantiiert. Dabei wird der Agent Server (agentsvr.exe) in einem separaten Prozess gestartet. Es läuft immer nur eine Instanz des Agent Servers, die von den unterschiedlichen Client-Anwendungen genutzt wird. Das Agent-Icon auf der Form ist zur Laufzeit nicht sichtbar.

Eine andere Möglichkeit ist, das Control zur Laufzeit zu erzeugen und eine Referenz darauf in einer Variablen zu speichern:

    PUBLIC oAgent
    oAgent = CREATEOBJECT("Agent.Control.2")

Dann muss man allerdings noch eine Connection zum MS Agent Server öffnen:

    oAgent.Connected = .T.

Die Connection wird geschlossen, wenn die Client-Anwendung beendet wird. Der Prozess des Agent Servers wird beendet, wenn keine Connection mehr zu ihm besteht.

Im Code können Methoden des Objekts und seiner untergeordneten Objekte nun folgendermaßen aufgerufen werden:

    thisform.Olecontrol1[<.Objekt>].<Methode>(<Parameterliste>)

bzw.:

    oAgent[<.Objekt>].<Methode>(<Parameterliste>)

Eigenschaften werden wie folgt gesetzt:

    thisform.Olecontrol1[<.Objekt>].<Eigenschaft> = <Wert>

bzw.:

    oAgent[<.Objekt>].<Eigenschaft> = <Wert>

Character laden

Nun kann man nahezu beliebig viele Character in die Characters-Collection laden. Die Daten der Character wer­den standardmäßig in .ACS-Files im Verzeichnis MSAgent\Chars unter dem Windows-Verzeichnis gespeichert. Als ersten Parameter gibt man beim Laden den Namen an, unter dem man den Character innerhalb der Collection anspricht. Der zweite Parameter ist der Name des ACS-Files. Wenn sich dieser in einem anderen als dem Stan­dardverzeichnis befindet, kann man auch den vollqualifizierten Pfad mitgeben:

    oAgent.Characters.Load("Genie", "genie.acs")

Wenn auf dem Rechner mehrere Character installiert sind, kann der Benutzer über den Eigenschafts-Dialog des Characters einen Standard-Character auswählen. Man kann einfach den Standard-Character laden, indem man den Namen der .ACS-Datei weglässt:

    oAgent.Characters.Load("NennMichWieDuWillst")

Man kann zwar grundsätzlich beliebige Namen wählen, mit denen man die Character in der Collection anspricht. Wenn man aber eine Referenz auf den Character in einer Variablen ablegen möchte, um den Character so direkt ansprechen zu können, dann muss man den Namen des Characters benutzen:

    oAgent.Characters.Load("Genie", "genie.acs")
    oChar = oAgent.Characters("Genie")
    oChar.<Methode>()

Character anzeigen und verschwinden lassen

Nachdem man das Control instantiiert und mindestens einen Character geladen hat, kann man den Character end­lich anzeigen. Dies geschieht über die Methode "Show". Der Character spielt bei seinem Auftritt seine Show-Animation ab.

    oChar = thisform.Olecontrol1.Characters("Genie")
    oChar.Show()

Verschwinden lassen kann man den Character über die Methode "Hide", was bewirkt, dass der Character seine Hide-Animation spielt und dann verschwindet. Unabhängig davon kann der Benutzer den Character jederzeit über das Kontextmenü verschwinden lassen.

    oChar.Hide()

Animationen

Jeder Character verfügt über eine bestimmte Anzahl von Animationen, die er abspielen kann. Die Animationen sind sprechend benannt, und es gibt eine Anzahl von Animationen, die von jedem Character unterstützt werden (z.B. die Show-Animation, die automatisch abgespielt wird, wenn der Character erscheint). Die Animationen wurden aber für jeden Character speziell programmiert, so dass unterschiedliche Character unterschiedliche Aktionen ausführen, wenn die Animation läuft. So fliegt z.B. Peedy ins Bild, während Merlin sich selbst herbei­zaubert. Es ist wichtig zu wissen, welche Animationen der Character unterstützt, denn wenn man versucht, eine Animation aufzurufen, die nicht von dem angesprochenen Character unterstützt wird, dann erzeugt das Control einen OLE-Ausnahmefehler. Eine Beschreibung der Animationen ist für jeden Character in der SDK-Dokumenta­tion vorhanden.

Die Namen der Animationen sind in der AnimationNames-Collection abgelegt. Es empfiehlt sich, diese Collection auszulesen, so dass man prüfen kann, ob eine Animation überhaupt existiert:

    LOCAL lnAnimationen, laAnimationen[1], lcAnimationName
    lnAnimationen = 1
      FOR EACH lcAnimationName in oChar.AnimationNames
      DIMENSION laAnimations[lnAnimationen]
      laAnimations[lnAnimationen] = lcAnimationName
      lnAnimationen = lnAnimationen + 1
    NEXT 

Man ruft Animationen auf, indem man den Namen der Animation als Parameter an die Methode "Play" des gewünschten Character übergibt:

    oChar.Play("Greet")
    oChar.Play("Announce")
    oChar.Play("Write")

Positionierung

Der Character kann sich selbsttätig auf der Arbeitsoberfläche positionieren. Man braucht nur in der Methode "MoveTo" die Koordinaten anzugeben, dann wird eine Bewegungsanimation gestartet, mit der der Character sich an die gewünschte Stelle bewegt:

    oChar.MoveTo(640, 480)

Agents programmieren: Weitere Schritte

Das Request-Objekt

Da sämtliche Aktionen über den Agent Server gesteuert asynchron ablaufen, läuft die Client-Anwendung sofort nach dem Aufruf von Animationen oder Methoden der Character weiter. Auch wenn man Aktionen von mehreren Characters ausführen lässt, werden diese nicht automatisch sequentiell abgespielt. Der Server startet die Anima­tionen zwar nacheinander, aber die Character sind unabhängig voneinander, so dass ein Character nicht darauf wartet, dass die Animation des anderen Characters fertig ist, bevor er seine Animation ablaufen lässt. Dadurch kommt es zu unerwünschten Überlagerungen. Um diese zu verhindern, erzeugt man beim Aufruf einer Methode ein Request-Objekt, dessen Status abgefragt oder in den Agent Control Events "RequestStart" und "RequestComplete" analysiert werden kann.

Wenn man ein Request Objekt erzeugt, wird man vom Agent Server automatisch über den Start, bzw. das Ende einer Aktion benachrichtigt. Dies geschieht über die Agent Control Events "RequestStart" und "RequestCom­plete". Da die Aktionen des Agent Servers asynchron laufen, muss man beachten, dass das Request-Objekt noch sichtbar ist, wenn das Event feuert. In der Agent Dokumentation wird dringend empfohlen, das Request-Objekt als globales Objekt zu deklarieren. Allerdings habe ich bis jetzt keine Nachteile feststellen können, wenn man das Request-Objekt als Eigenschaft einer Form deklariert, auf der das Agent Control aggregiert ist.

Beispiel für RequestComplete():

    Im Form.Init() wird der Character geladen:
    PUBLIC goRequest
    goRequest = goAgent.Characters.Load("genie", "genie.acs")

Im Event RequestComplete() des Agent Controls wird das Request-Objekt abgefragt:

    PROCEDURE RequestComplete
    *** ActiveX-Steuerelementereignis ***
    LPARAMETERS request

    * Das Event feuert bei jedem Request. Deshalb wird hier abgefragt,  ob es sich um das gewünschte Objekt handelt. Achtung: das Objekt wird erst erzeugt, wenn der Agent Server den Befehl ausführt! Deshalb muss unbedingt abgefragt werden, ob goRequest bereits ein Objekt ist!

    IF TYPE("goRequest") == "O" AND request.id = goRequest.id
      WAIT WIND "Die Character-Daten wurden geladen!"
    ENDIF

Wenn man die Aktionen mehrerer Character sequentiell ablaufen lassen möchte, kann man auch die Methode “Wait” des Characters nutzen. Wait wartet darauf, dass ein Request beendet wird. So kann man Aktionen mehre­rer Character sequentiell ablaufen lassen:

Beispiel für den sequentiellen Ablauf von Aktionen mehrerer Agents:

    ...
    oGenie= goAgent.Characters("Genie")
    oMerlin= goAgent.Characters("Merlin")
    oGenieReq= oGenie.Speak("Was ist ein Strohballen in einem Manta?")
    oMerlin.Wait(oGenieReq)
    oMerlinReq = oMerlin.Speak("Weiß ich nicht. Erzähl es mir.")
    oGenie.Wait(oMerlinReq)
    oGenieReq= oGenie.Speak("Na, Extended Memory natürlich!")

Das Request-Objekt verfügt über folgende Stati, die abgefragt werden können:

Status

Beschreibung

0

Request erfolgreich abgeschlossen

1

Request fehlerhaft abgeschlossen

2

Request wartet in der Queue auf Ausführung

3

Request unterbrochen

4

Request wird gerade abgearbeitet

Beispiel für die Status-Abfrage:

    IF TYPE("goRequest") == "O"
         DO CASE
           CASE request.status = 0
               WAIT WIND "Die Aktion wurde erfolgreich ausgeführ."
              CASE request.status = 1
               WAIT WIND "Es ist ein Fehler aufgetreten."
    ...
      ENDCASE
    ENDIF

Die folgenden Methoden können ein Request-Objekt zurückgeben: GestureAt, Get, Hide, Interrupt, Load, MoveTo, Play, Show, Speak, Wait.

Sprachausgabe

Der Character spricht über die Methode „Speak“. Man kann dieser Methode einen beliebigen Text mitgeben. Der Text wird standardmäßig über eine Sprechblase ausgegeben und tatsächlich gesprochen. Dabei werden die Lip­penbewegungen des Characters mit dem gesprochenen Text synchronisiert. Voraussetzung für die erfolgreiche Ausgabe von Text als Sprache ist die korrekte Installation der Text-To-Speak-Engine und der Sprachbibliothek in der gewünschten Sprache.

    oChar.Speak("Hallo, ich bin Genie")

Die Sprache, in der der Character den Text sprechen soll, wird über seine Eigenschaft „LanguageID“ eingestellt. Die ID für deutsche Aussprache ist 409 hexadezimal. Natürlich kann man den Character auch in jeder anderen Sprache sprechen lassen, aber die Ergebnisse sind eher zur Erheiterung denn als Information zu gebrauchen, wenn die eingestellte Sprache nicht der des ausgegebenen Textes entspricht.

    oChar.LanguageID = 0x407

Außerdem kann man über die Eigenschaft „TTSModeID“ bestimmte Stimmen einstellen. Diese ist mit der ModeID der gewünschten Engine zu füllen. Eine Übersicht über die unterschiedlichen Modes gibt es im Doku­ment Speechengines.doc bei der Dokumentation zum Agent SDK. Hier zum Beispiel die Stimme einer deutschen Frau:

    oChar.TTSModeID = "{3A1FB760-A92B-11D1-B17B-0020AFED142E}"

Die Stimme kann über den Sprach-Eigenschaftsdialog verändert werden. Wenn man das Speech Control Panel installiert, wird dies zur Systemsteuerung hinzugefügt:

Abbildung 4: Speech Control Panel

Nun passiert es durchaus, dass die ausgewählte Stimme den Text nicht ganz so ausspricht, wie man es gerne hätte. Vor allem fremdsprachliche Ausdrücke werden brutal mit dem Akzent ausgesprochen, welcher der ausgewählten Stimme entspricht. Um dies zu verhindern, kann man die phonetische Entsprechung im Text mitgeben. Die Syntax dafür ist:

    \Map = "<phonetisch>" = "<Text>" \

Damit Genie den Satz „Visual FoxPro ist toll“ verständlich von sich geben kann, muss man also die Methode Speak folgendermaßen aufrufen:

    oChar.Speak(" \Map="+CHR(34)+"Wischuell FoxProo"+CHR(34)+"="+CHR(34)+ 
    "Visual FoxPro"+CHR(34)+"\ ist toll")

Das Command-Objekt

Jede einzelne Client-Anwendung kann pro Character eine eigene Reihe von Befehlen definieren, die als Com­mands in der Commands-Collection abgelegt werden. Um einen Befehl zur Commands-Collection hinzuzufügen, benutzt man die Methoden „Add“ oder „Insert“ der Commands-Collection. Dabei wird der Name des Commands, sein Text im Pop-up-Menü und sein Sprachkommando als Parameter übergeben. Für jedes Command kann fest­gelegt werden, ob es im Pop-up-Menü des Clients auftauchen soll und ob es über Spracheingabe aufrufbar sein soll. Das kann direkt beim Hinzufügen des Commands zur Collection geschehen oder nachträglich über die Eigen­schaften des Commands eingestellt werden. Die Eigenschaften „Voice“ und „VoiceCaption“ bestimmen, welches Wort gesprochen werden muss, damit das Command erkannt wird, bzw. welcher Text im Spracheingabefenster erscheinen soll. Die Eigenschaften „Caption“ und „Visible“ des Commands bestimmen, was im Pop-up-Menü als Bezeichnung für dieses Command ausgegeben wird, bzw. ob diese Auswahl überhaupt sichtbar ist.

Syntax des Befehls Add:

    agent.Characters("<ID>").Commands.Add <Name> |,<Caption>| |,<Voice>|
    |,<Enabled>| |,<Visible>|

Das folgende Beispiel fügt ein Command zur Commands-Collection, dem Pop-up-Menü und der Spracherken­nung hinzu. Das Command ist standardmäßig aktiv und im Pop-up-Menü sichtbar:

    oChar.Commands.Add("CharOpt" , "&Erweiterte Optionen", "options")

Damit der Character die Befehle hören und (hoffentlich) erkennen kann, muss man ihn in den Listen-Mode verset­zen. Dies geschieht, indem man die Methode „Listen“ des Characters aufruft und als Parameter „.T.“ übergibt. Der Listen-Mode kann wieder ausgeschaltet werden, indem man die Methode „Listen“ mit dem Parameter „.F.“ aufruft, allerdings ist der Listen-Mode längstens für etwa 10 Sekunden aktiv. Danach ist der Character nicht mehr für gesprochene Befehle empfänglich. Aufgrund des hohen Ressourcenverbrauchs wird dringend davon abgeraten, den Listen-Mode öfter oder länger als nötig zu aktivieren. Ein ständig zuhörender Character, wie man es sich so wünschen könnte, wird also eher das Betriebssystem in die Knie zwingen als von echtem Nutzen zu sein.

    oChar.Listen(.T.)

Wenn nun der Character den gesprochenen Befehl erfolgreich erkannt hat, oder wenn der Benutzer einen Befehl aus dem Pop-up-Menü aufgerufen hat, wird das Event „Command“ des Agent Controls ausgelöst. Es erhält das aufgerufene Command-Objekt als Parameter. Man kann in diesem Event abfragen, welches Command aufgerufen wurde und die entsprechenden Aktionen dafür ausführen.

    PROCEDURE Command
    LPARAMETERS toCommand
    DO CASE
       CASE toCommand.Name == „CharOpt“
          this.PropertySheet.Visible = .T.       && Eigenschaftsdialog anzeigen
       CASE toCommand.Name == „ChgChar“
          this.ShowDefaultCharacterProperties()  && Character auswählen
       CASE toCommand.Name == „UsrDef“
          ...
       OTHERWISE
       ...
    ENDCASE

Distribution

Um die Dienste des Microsoft Agent nutzen zu können, muss der Agent bereits auf dem Zielsystem installiert sein. Man kann den Microsoft Agent kostenfrei mit der eigenen Anwendung ausliefern, muss dafür aber ein Lizenzab­kommen ausfüllen, um von Microsoft eine Distributionslizenz für den Agent zu bekommen. Das Lizenzabkommen ist in der Datei Agentlic.doc in der Dokumentation zum SDK mitgeliefert. Eine Beschreibung des Lizenzierungs­vorgangs findet man im Dokument Licensing.doc.

Man kann dann die selbstinstallierenden Dateien des Agents mit dem eigenen Programm ausliefern. Man sollte die Agent-Dateien nicht in die Installation des Anwendungsprogramms einbinden, sondern statt dessen die selbst­installierenden Agent-Programme z.B. nach Installation des Anwendungsprogramms ablaufen lassen. Dies kann im Rahmen der Installationsroutine z.B. als nachgelagerte Aktion erfolgen. Alternative Installationsmöglichkeiten wie das Kopieren von einzelnen Agent-Dateien werden nicht unterstützt. Die Installation des Microsoft Agent Servers wird nicht auf Windows 2000 und Windows Me Systemen laufen, weil beide bereits den Agent als Teil des Betriebssystems enthalten.

Um den Agent Server erfolgreich installieren zu können, muss außerdem sichergestellt sein, dass das Zielsystem bereits eine aktuelle Version der Microsoft Visual C++ Runtime (Msvcrt.dll), das Microsoft Registrierungs Tool (Regsvr32.dll) und die Microsoft COM-DLLs enthält. Am einfachsten ist dies zu erreichen, in dem man auf dem Zielsystem den Microsoft Internet Explorer 3.02 oder folgende installiert. Alternativ kann man auch die beiden ersten Komponenten separat installieren, sie sind Teil von Microsoft Visual C++. Die benötigten COM-DLLs können als Teil des Microsoft DCOM Updates installiert werden, welches auf der Microsoft Web Site erhältlich ist. Weitere Informationen auch zur Lizenzierung können ebenfalls auf der Microsoft Web Site eingesehen wer­den.

Die Sprachkomponenten und Character-Daten werden ebenso über selbstinstallierende Programme installiert. Dabei werden die ACS-Dateien der Character automatisch in das Verzeichnis Agent\Chars unter dem Betriebs­systemverzeichnis installiert.

Bonus: InputBox

Wäre es nicht schön, wenn man den Agent wie einen Office-Assistenten agieren lassen könnte? Nicht etwa, dass die meisten Programmierer die hüpfende Büroklammer auch nur ansatzweise erträglich fänden, aber viele Benut­zer haben sich daran gewöhnt, Suchbegriffe in eine Textbox auf der Sprechblase des Assistenten eingeben zu können. Leider sind die Möglichkeiten der Microsoft Agents dahingehend ziemlich limitiert. Nun gibt es eine ganze Reihe ambitionierter VB-Programmierer, die den Agent in ihr Herz geschlossen haben. Darunter ist Esteban Hugo Somma, der das ActiveX-Control MsgBalloon geschrieben hat. Die Nutzung und Distribution des Controls ist nicht lizenzierungsbedürftig. Man kann das Control z.B. in die Form einbinden, auf der sich das MS Agent Control befindet. Wenn man den MsgBalloon aufruft, sucht er den Agent, zeigt die gewünschte Message an und gibt den eingegebenen Text zurück. Im Beispiel unten wurde das MsgBalloon-Control als Objekt „oleBalloon“ auf die Form aggregiert:

    LOCAL lcResult
    oChar.Balloon.Visible = .F.
    lcResult = thisform.oleBalloon.InputBalloon( ;
            "Bitte geben Sie etwas ein:", "Eingabe über InputBox", , oChar)
    IF !EMPTY(lcResult)
       MESSAGEBOX(lcResult)
    ENDIF

Weitere Informationen zum MsgBalloon gibt es beim Autor des Controls unter:

http://www.textildoss.com.ar/msgballoon/MsgBalloon.htm

Visual FoxPro 7.0

Unter den Foundation Classes von VFP 7.0 befindet sich auch ein MS Agent Wrapper. Dieser und die dazu bereitgestellten Beispiellösungen können als Informationsquelle für eigene Agent-Programmierung oder direkt genutzt werden.

Wo gibt es Informationen über Agents?

Das MS Agent SDK ist in kompletter Form auf der Konferenz-CD vorhanden. Wichtigste Informationsquelle ist die Dokumentation zum MS Agent SDK. Diese ist bei Microsoft Press in gedruckter Form, bzw. im SDK als Word-Dokumente vorhanden.

Die Vielzahl der Dokumente ist allerdings zunächst erschlagend, wenn man in das Doku-Verzeichnis schaut. Das wichtigste Dokument ist m.E. ProgAgentControl.doc, das sich mit der Programmierung des Agent Controls und der dazugehörigen Objekte beschäftigt. Man sollte allerdings das Objekt-Modell des Agents verstanden und stän­dig vor Augen haben, um in diesem Dokument erfolgreich navigieren zu können. Das Dokument hat etwa 115 Seiten und ist nach dem Objekt-Modell aufgebaut. Am einfachsten geht die Navigation, wenn man sich das Dokument in Online-Layout Ansicht anzeigen lässt und dann auf der Inhaltsleiste das gewünschte Objekt aus­wählt.

Wichtig sind auch die Dokumentationen zu den Character-Animationen. Die Character verfügen über einen teilweise gleichen, teilweise unterschiedlichen Satz von Animationen. Wenn man versucht, eine Animation für einen Character aufzurufen, die es nicht gibt, dann gibt es eine Fehlermeldung vom Agent-Control. Die Doku­mentation zu den Animationen befindet sich in den Dateien <Charactername>AnimationList.doc.

Zur Lizenzierung gibt es im Dokument Licensing.doc Informationen. Das Lizenzabkommen selbst ist im Doku­ment Agentlic.doc. Weitere Infos sind dazu auch unter:

http://www.microsoft.com/sitebuilder/workshop/imedia/agent/licensing.asp

Die Foundation Classes und Samples in VFP 7.0 sind sehr schön zum abgucken, schließlich sind es fast die einzi­gen VFP-Beispiele, die mir bisher untergekommen sind. Die Klassen befinden unter: ...VFP7\FFC, Beispiele gibt es unter: ... VFP7\SAMPLES\SOLUTION\FFC.

Die in der Session gezeigten Beispiele sind natürlich auch auf der Konferenz-CD vorhanden. An dieser Stelle vielen Dank an Bernard Wong von Microsoft, dessen Beispiele und Session ich als Anregung nutzen konnte.

Eine sehr rege und kundige NewsGroup findet man unter news:microsoft.public.msagent. Dort kommunizieren hauptsächlich VB-Programmierer, aber die Agent-Probleme sind ja größtenteils sprachunabhängig.

Ein lockerer Zusammenschluß von MS Agent Designern und Programmierern findet sich im www unter: www.agent-launchpad.co.uk/links/webring.html. Von dieser Seite aus kann man sich auf weitere WebSites leiten lassen, die MS Agent nutzen.

Last not least: Die Microsoft Agent WebSite: http://www.microsoft.com/msagent. Dort gibt es das gesamte SDK zum herunterladen und alle möglichen Informationen und Werbetexte.


vorheriger Vortrag D-DEVE

zur Übersicht der Gruppe PROG

nächster Vortrag E-SENS

 

dFPUG c/o ISYS GmbH

Frankfurter Str. 21 b

 

D-61476 Kronberg

per Fax an:

+49-6173-950903

s

konferenz@dfpug.de

© Texte, Grafiken und Inhalt: ISYS GmbH