Использование Microsoft Agent в Visual Basic


Шатрыкин Иван, VBline


Введение


    Многим из Вас уже, наверняка, приглянулся один из персонажей Microsoft Agent. Agent, на мой взгляд, - это одно из наиболее интересных нововведений фирмы Microsoft за последние годы, а стандартная поставка ядра Agent с Windows 2000, делает очень перспективным его включение в Ваши программы. Более того, на сайте Microsoft доступен бесплатный редактор для создания новых персонажей Agent, а в сети Интернет появляются сайты, на которых представлены большие коллекции персонажей. Так что же мешает программистам более активно использовать Agent в своих разработках? Скорее всего незнание этого замечательного компонента. В этой статье я попытаюсь рассказать Вам о методике работы с ним.

Обзор возможностей Agent


    А что мы тут, собственно говоря, хотим описывать? Давайте для начала разберемся, нужен ли нам этот Agent или нет. Microsoft Agent версии 2.0 может очень многое. Во-первых, Вы можете "оживить" свои программы, если в ней будет жить маленький, интеллектуальный, веселый "персонаж". Он может грустить, веселиться, перемещаться по экрану и т.д., а если к нему долго не обращались, то даже может засыпать! Во-вторых, как Вы относитесь к тому, если Agent будет говорить? А если по-русски? В-третьих, Вы сможете спрашивать пользователя не с помощью стандартного MsgBox, а при помощи красивых диалоговых окон (таких, как в Microsoft Office), "привязанных" к Agent, дополнительно потрудившись, или "разорившись" ;-). Неужели всё это ещё не убедило Вас в написании нескольких дополнительных строк кода, необходимых для включения Agent в Ваши программы?

Ссылка на объект "Персонаж"


    Итак, для того, чтобы поработать с Agent, нам потребуется ссылка на объект типа IAgentCtlCharacter или IAgentCtlCharacterEx. В принципе, можно использовать любой из этих типов, но предпочтительнее Ex, так как IAgentCtlCharacter устарел и оставлен из соображений совместимости. Получив ссылку, мы сможем работать с персонажем. Ссылку можно получить двумя основными способами. Первый из них наиболее простой, но и менее гибок, второй обладает хорошей переносимостью, но он сложнее.

    Первый способ.

Этот способ использует раннее связывание для получения ссылки. Делается все очень просто. Помещаем на форму объект Agent, предварительно добавив его на панель компонентов с помощью диалогового окна "Components" (нажмите Ctrl+T, для его вызова). Теперь в событие Form_Load впишите:

'переменная для ссылки
Dim Agent As IagentCtlCharacterEx
'загружаем персонаж
Agent1.Characters.Load "my character", "genie.acs"
'ссылка на персонаж
Set Genie = Agent1.Characters ("my character")
Или
'переменная для ссылки
Dim Agent As IagentCtlCharacterEx
'загружаем стандартного персонажа
Me.Agent1.Characters.Load "Default"
'ссылка на персонаж
Set Agent = Me. Agent1.Characters.Character("Default")

    Итак, как Вы уже заметили здесь тоже два варианта, первый загружает указанный персонаж, в данном случае "Гений" (из папки Chars), второй загружает персонаж "по умолчанию". В любом случае ссылка на объект в нашем распоряжении.

    Второй способ. Используем позднее связывание, этот метод хорош в случае, если Вы не знаете, есть ли у Вашего клиента Microsoft Agent. Здесь Вы можете предусмотреть такую ситуацию и продолжить работу без использования Agent.

'переменные для ссылок
Private MSAgent As Object
Private AgentChar As Object
'включаем обработчик ошибок
On Error Resume Next
Set MSAgent = CreateObject("Agent.Control.2")
'здесь можно проверить, установлен ли Agent на компьютере
If Err.Number Then
    MsgBox "Agent не найден на этом компьютере!"
Else
'подключаемся к серверу Agent
MSAgent.connected = True
'загружаем стандартного персонажа
MSAgent.Characters.Load "Default"
'ссылка на персонаж
Set AgentChar = MSAgent.Characters("Default")
End If

    Естественно, что Вы также можете загрузить любого персонажа, указав в методе Load файл, содержащий его.

    Важно: При завершении своей программы не забудьте удалить ссылки на созданные объекты. Это, кстати, касается не только Agent.

    Обратите внимание, что дальше по тексту я буду использовать ObjectIAgentCtlCharacterEx вместо ссылки на Ваш персонаж.

Стандартные персонажи


    В настоящее время на сайте Microsoft доступны четыре стандартных персонажа, которые Вы можете использовать. Это Genie, Merlin, Peedy попугай и Robby робот.

    Кроме стандартных Agent-ов в сети Интернет, мне известно более 40 различных персонажей на любой вкус. Более того Вы можете воспользоваться специальным редактором и создать свой неповторимый персонаж. Работая со стандартным персонажем Microsoft Вы должны помнить, какие анимационные эффекты они поддерживают или проверять наличие анимации с помощью коллекции AnimationNames, которая имеется у каждого персонажа. Выяснив, что нужная анимация поддерживается, можно заставить персонаж ее воспроизвести с помощью метода Play.

objectIAgentCtlCharacterEx.Play "Greet" 'воспроизведем анимацию "Приветствие"
'пробежимся по всей анимации
For Each Animation In objectIAgentCtlCharacterEx.AnimationNames
    objectIAgentCtlCharacterEx.Play Animation
Next

    Важно: Некоторые типы анимации, например "Hearing" (будь то Hearing_1, Hearing_2 и т.д.) являются циклическими и Вы должны позаботиться о ее остановке. Это можно сделать с помощью метода Stop или StopAll.

'запуск анимации
Set MyRequest = objectIAgentCtlCharacterEx.Play ("Hearing_1")
'что-нибудь делать
….
'остановить анимацию
objectIAgentCtlCharacterEx.Stop MyRequest

    У Вас, конечно, может возникнуть вопрос, а как узнать, что анимация выполнена? Для этого можно использовать такой код:

Dim MyRequest as Object
...
MyRequest = objectIAgentCtlCharacterEx.Play ("GestureRight")
...
Sub objectIAgentCtlCharacterEx _RequestComplete (ByVal RequestID as Object)
If RequestID = MyRequest Then
    MsgBox = "Анимация завершена!"
End If
End Sub

    У стандартных персонажей Agent есть одна очень интересная особенность, они могут загружать анимацию прямо с сервера Microsoft с помощью метода Get, более того Вы даже можете загрузить всего персонажа с сервера, так что если у Вас хороший и, главное, быстрый Интернет-канал, то, пожалуйста, пользуйтесь, но у Ваши клиентов может быть, вообще нет Интернет, так что это тупиковый путь, поэтому читайте документацию к Agent сами.

Русская речь с английским акцентом


    Как Вы уже догадались, сейчас я попробую Вам рассказать о том, как заставить Agent разговаривать. В настоящее время Agent может разговаривать на 11 языках мира, в числе которых есть и русский язык. Я уже говорил о том, что для использования Agent его ядро должно быть установлено на компьютере, где программа будет выполняться. Так вот, для использования персонажа, который будет говорить, Вам нужно загрузить с сайта Microsoft ещё и Text-to-speech engines для нужного языка. Например, для русского языка нужно загрузить модуль http://activex.microsoft.com/activex/controls/agent2/lhttsrur.exe. Только после установки этого модуля Ваш персонаж заговорит по-русски!

    Ну, скачали? Теперь поехали дальше. Существует метод Speak, который заставит сказать Agent нужную Вам фразу. Но, перед использованием Speak, Вам нужно ещё указать язык, на котором Agent должен говорить, иначе он попытается произнести фразу на языке по-умолчанию, а но, конечно же, может не совпасть с нужным Вам. Русский язык в Microsoft, обычно, "числится" под номером &H0419, и здесь исключения не сделали. Итак:

ObjectIAgentCtlCharacterEx.LanguageID = &H0419
'вот теперь всё готово к "разговорам"!
ObjectIAgentCtlCharacterEx.Speak "Привет, я Microsoft Agent!"

    Если Вы сделали всё правильно, то Agent произнесет эту фразу, а Вы, естественно, её услышите, если, конечно у Вашего компьютера есть звуковая карта. Да, и не только услышите, но и увидите в Balloon появившемся возле персонажа.

    Важно: Обратите внимание, что метод Speak выполняется асинхронно, т.е. если Вам нужно сделать так, чтобы, например MsgBox появился после произнесения Agent фразы, то нужно сделать ещё некоторые усилия. Нужно воспользоваться объектом "закладка".

ObjectIAgentCtlCharacterEx.Speak "Вы хотите сохранить\mrk=100\ этот файл?"

Sub ObjectIAgentCtlCharacterEx_Bookmark (ByVal Bookmark as Long)
'как только Agent "дойдет" до закладки, то мы попадем сюда 
'проверим номер закладки
If Bookmark = 100 Then 
    MsgBox = "Сохранить файл?"
End If
End Sub

    Вы уже, наверное догадались, что для определения закладок существует ключевое слово \mrk=XXX\, где XXX номер Вашей закладки. Это очень полезное и мощное средство для работы с Agent.

Поговорим?


    Что? Он ещё и меня может слушаться? Да, да .. этот забавный персонаж ещё может слушать что Вы ему говорите через микрофон, и выполнять введенные Вами команды. Но, мне очень жаль, что Agent, в настоящее время, не поддерживает ввод речи на русском языке, поэтому описывать эту его функциональную возможность я не хочу. Так что читайте документацию к нему сами.

Диалог с пользователем


    Вот здесь разработчики Microsoft явно прокололись, и решили, что красивые Balloon диалоговые окна, как в Office, простым программистам не нужны. Но, иметь в своей программе Agent и задавать вопросы с помощью стандартного MsgBox, это, конечно, не есть хорошо. Да, Вы можете обратившись к WinAPI написать код для вывода этих Balloon, но зачем тратить драгоценное время, если я и мой напарник его уже потратили и написали для Вас OCX, который реализует диалог с пользователем. Всё что от Вас нужно, это подключить OCX к Вашей программе, создать ссылку на Agent.Character, передать её OCX и пользуйтесь! Но, естественно, что мы бы хотели с этого что-то иметь. Подробнее на http://www.vbline.narod.ru/balloonmessage/ru/basic.htm, приходите, пишите письма, я буду рад!