第 1 回 VC# で MSAgent
〜 Visual C# .NET による MSDNAA おもしろプログラミング 〜
1.1 はじめに
近年、Windows の普及とともに、Windows 環境での開発者が急増してきました。Microsoft 社では、増加してきた開発者のために Microsoft 社製品の上で開発を行うための様々な情報を集めた開発者用ネットワーク MSDN (Microsoft Developer Network) を展開しています。この MSDN や、学生用開発ネットワークである MSDN AA (Microsoft Developer Network Academic Aliance) では、様々な開発用のテクノロジーやコンポーネントなどが大量に公開されています。開発者は、これらのリソースを有効活用することにより、プログラミングの幅を大きく広げることができます。その内容は、業務アプリケーションを開発するのに有用なコンポーネントや OS の API を利用するためのもののように実践・実用的なものもあれば、マルチメディアコンポーネントやデスクトップ上でマスコットを動かすものなどのように一風変わったコンポーネントまで多岐にわたります。
このような背景の中、本コラムでは、MSDN や MSDNAA の中で公開されているリソースの中でも、プログラミングの楽しさを追及できるものを集めて紹介し、新しいオブジェクト指向言語 「Visual C#. NET」 での利用法を解説していきます。そのため、本コラムではプログラミング初級者にとって楽しくプログラミングできることを目指します。また、プログラミング中・上級者にとっては、一風変わったコンポーネントを利用することにより、プログラミングの幅が広がることを目指します。
第一章では、数あるリソースの中でも、プログラミングしていて非常に楽しい 「MSAgent」 技術を解説します。
1.2 エージェント技術と MSAgent
1.2.1 エージェントとは
近年、コンピュータが身近なものになり、専門家だけでなく、一般の家庭にもコンピュータが浸透して来ました。また、ソフトウェア技術も進化し、ワープロソフトや表計算ソフトなどの高機能化・複雑化の一途を辿っています。
ユーザがより簡単に、より自然に、コンピュータを利用できるようなインタフェースを実現するためのソフトウェア技術が必要となってきました。それがエージェント技術です。エージェント技術といっても、その種類は大きく二つに分類することができます。
ひとつ目のエージェント技術は、人間のかわりに様々な仕事を行ってくれる 「代理人」 としてのエージェントを開発するという動きです。こちらの技術は主にネットワーク上でエージェント同士が協調作業を行う技術を指します。
一方、二つ目のエージェント技術は、人間に対して自然なインタフェースを提供するための技術です。例えば、Microsoft Word や Microsoft Excel などの Office 製品を利用した人であれば、イルカのマスコットが質問に応答し、様々な操作支援を行う光景を見たことがあると思いますが、このヘルプシステムは、Microsoft 社が開発したエージェント技術 「MSAgent」 を利用して開発されているのです。ヘルプシステムを図 1 に示します。

図 1 : MSAgent 技術を利用した Office アシスタント
1.2.2 MSAgentとは
開発者は、自分のアプリケーションに MSAgent の技術を組み込むことにより、ユーザに対してより簡単でより自然なインタフェースを提供することができます。
また、MSAgent では、動作のためのメソッドを多く実装しているため、プログラマは非常に短いソースコードの組み合わせでエージェントを動作させることができます。そのため、プログラミング初心者にとっては、プログラミング勉強用の教材としても大変面白いものになります。
1.2.3 MSAgent とキャラクターファイル
MSAgent の技術を利用するためには、MSAgent の構成を把握する必要があります。MSAgent 技術は、エージェントを操作するための MSAgent コントロールと、エージェントの動作 (アニメーションと音声) を格納したキャラクターファイルで構成されています。 MSAgent の概念を図 2に示します。

図 2 : MSAgent の概念
まず、プログラムの開発者は、エージェントの動作情報が格納されたキャラクターファイルを入手する必要があります。キャラクターファイルは、様々な企業・団体・個人が作成しています。これらのキャラクターファイルを入手すれば、自分のプログラムの中で様々なエージェントを登場させることがます。MSDN には、4 つのキャラクターファイルが用意されています。MSDN に用意されているキャラクターファイルを表 1 に示します。
表 1 : MSDN で公開されているキャラクターファイル
ジーニー (Genie.acs) |
マーリン (Merlin.acs) |
ロビー (Robby.acs) |
ピーディー (Peedy.acs) |
 |
 |
 |
 |
次に、入手したキャラクターをプログラムから利用するためには、Microsoft 社が用意している MSAgent コントロールをプログラムの中に組み込む必要があります。最後に、MSAgent コントロールに対し、キャラクターファイルの読み込み命令や、動作命令を送ることにより、エージェントが動作します。
1.3 MSAgent の利用
本節では、実際に MSAgent 技術を利用してプログラムを開発しながら、MSAgent 技術の利用方法を解説します。本節で開発するプログラムは、「秘書エージェント」 です。
1.3.1 秘書エージェントの概要
本節で開発する秘書エージェントには、予定表の管理機能を搭載します。予定確認・更新機能で登録した予定を保存しておき、本日の予定確認機能により、本日に予定しているスケジュールを読み上げるというシンプルなプログラムです。エージェント技術の内容に焦点を絞るため、ファイルへの保存機能は割愛します。秘書エージェントの完成図を図 3 に示します。

図 3 : 完成図
本プログラムで特筆すべき点は、コーディング量の少なさです。MSAgent 技術と .NET コンポーネントを利用すると、これだけの機能をもったプログラムでも、実質 30 ステップから 40 ステップ程度のプログラミングで開発することができます。
1.3.2 キャラクターファイルのインストール
MSAgent を利用するためには、まずキャラクターファイルを用意する必要があります。本コラムでは、キャラクターファイルは MSDN の Web ページからダウンロードします。まず、MSAgent の開発者用ページにある、キャラクターデータのダウンロードページ (http://www.microsoft.com/msagent/downloads/user.aspx#character) へ移動します。次に、必要なキャラクターファイルをクリックし、ダウンロードを行います。本コラムでは、ジーニー (Genie.exe) を利用します。キャラクターファイルのダウンロードページを図 4 に示します。

図 4 : キャラクターファイルのダウンロード
1.3.3 プロジェクトの作成
Visual Studio.NET を起動し、スタートページから 【新しいプロジェクト】 ボタンをクリックします。【プロジェクト】 の種類には 【Visual C#プロジェクト】 を選択し、【テンプレート】 の種類には 【Windows アプリケーション】 を選択します。プロジェクトの作成方法を図 5 に示します。

図 5 : プロジェクトの作成方法
1.3.4 MSAgent コンポーネントの追加
MSAgent をプログラムの中で利用するためには、Microsoft Agent Control をツールボックスに登録する必要があります。まず、ツールボックスを右クリックし、【ツールボックスのカスタマイズ】 を選択します。次に、ツールボックスのカスタマイズウィンドウで、【COM コンポーネント】 の中から、【Microsoft Agent Control 2.0】 を選択し、OK ボタンをクリックすると、ツールボックスに MSAgent コントロールが追加されます。ツールボックスへの登録の手順を図 6 に示します。

図 6 : ツールボックスへの登録
1.3.5 メインフォーム (Form1.cs) の作成
メインフォームには、エージェントをコントロールするための MSAgent コントロールと、プログラム終了のためのボタンを配置します。また、メインフォームは、ロードされたときにエージェントを呼び出す処理を行います。
(1) コントロールの配置
メインフォームには、図 7 に示すようにコントロールを配置します。

図 7 : メインフォームのコントロール配置
(2) プロパティの設定
各コントロールのプロパティには、次の値を設定します。メインフォームに配置するコントロールのプロパティ設定を表 2 に示します。
表 2 : メインフォームに配置するコントロールのプロパティ設定
コントロール名 | プロパティ | 設定値 |
Form1 | Text | 秘書エージェント |
| MaximizeBox | FALSE |
button1 | Text | 終了 |
(3) イベントハンドラの追加
メインフォームにイベントハンドラを設定します。追加するイベントハンドラの一覧を表 3 に示します。
表 3 : 追加するイベントハンドラ一覧表
コントロール名 | イベント名 | イベントハンドラ名 |
Form1 | Load | Form1_Load |
axAgent1 | DblClick | axAgent1_DblClick |
button1 | Click | button1_Click |
各コントロールのイベントに対し、イベントハンドラを設定するには、コントロールを選択した後に、プロパティウィンドウで次の操作を行います。イベントハンドラの設定方法を図 8 に示します。

図 8 : イベントハンドラの設定方法
(4) ソースコードの追加
メインフォームに記述するソースコードを次に示します。
private void Form1_Load(object sender, System.EventArgs e)
{
axAgent1.Characters.Load("Genie", "genie.acs"); // キャラクターファイルの読み込み
Genie = axAgent1.Characters.Character("Genie"); // ジーニー君を選択
Genie.Show(null); // ジーニー君の登場
Genie.Speak("御呼びでしょうか",null); // 登場メッセージの表示
Genie.Play("Pleased"); // 命令要求アクション
}
private void axAgent1_DblClick(object sender, AxAgentObjects._AgentEvents_DblClickEvent e)
{
string sSchedule; // 確認用スケジュール
// Shiftキーが押されている場合
if(e.shift == 1)
{
// スケジュール確認・更新用のウィンドウ表示
Form2 frmSchedule = new Form2(); // フォームの生成
frmSchedule.hshSchedule = hshSchedule; // 予定表ハッシュテーブルの委譲
frmSchedule.Show(); // 予定確認・変更フォームを開く
Genie.Play("Write"); // 巻物に書き込む
Genie.Play("ReadReturn"); // 巻物を片付ける
}
// Shiftキーが押されていない場合
else
{
// 本日の予定がない場合
if(hshSchedule[DateTime.Today.ToString()] == null)
{
Genie.Play("Confused"); // 困惑する
Genie.Speak("今日の予定は特にありません",null); // 予定なしメッセージ
}
// 本日の予定がある場合
else
{
// 予定の文字列を作成
sSchedule = ((string)hshSchedule[DateTime.Today.ToString()]).Replace("\n",",");
// 巻物を出し,予定を読み上げる
Genie.Play("Read"); // 巻物を読む
Genie.Speak("今日の予定は" + sSchedule + "です",null); // 予定読み上げ
Genie.Play("ReadReturn"); // 巻物を片付ける
}
}
}
private void button1_Click(object sender, System.EventArgs e)
{
Application.Exit();
}
private AgentObjects.IAgentCtlCharacterEx Genie; // ジーニー君オブジェクト用変数
private Hashtable hshSchedule = new Hashtable(); // 予定表管理用ハッシュテーブル
(5) ソースコードの解説
エージェントを画面に表示するには、Show メソッドを利用します。
キャラクター.Show (bool アニメーションスキップ)
|
通常、Show メソッドを利用するとアニメーションと共にエージェントが登場しますが、アニメーションスキップに True を設定すると、アニメーションは実行されません。
エージェントに何か話をさせるためには、Speak メソッドを利用します。Speak メソッドの構文を次に示します。
キャラクター.Speak (string テキスト, string リンク);
|
エージェントは、引数テキストに指定した文字列を読み上げます。また、引数リンクに任意の URL を指定すると、テキストにリンクを張ることができます。リンクを張る必要がない場合は、null を指定します。
エージェントに何か動作をさせるためには、Play メソッドを利用します。Play メソッドの構文を次に示します。
キャラクター.Play (string アニメーション名);
|
Play メソッドで利用可能なアニメーションはキャラクターファイルごとに異なります。ジーニーの主なアニメーションリストを表4に示します。
表 4 : ジーニーの主なアニメーション
Confused (困惑) |
Pleased (喜ぶ) |
Read (読む) |
Write (書く) |
 |
 |
 |
 |
困惑する動作を示すときに利用します。 |
喜ぶ動作を示すときに利用します。 |
文章を読む動作を示すときに利用します。 |
文章を書く動作を示すときに利用します。 |
サウンド効果なし |
サウンド効果なし |
サウンド効果あり |
サウンド効果あり |
このほかにも、ジーニーだけで 80 近くのアニメーションが用意されています。これらの豊富に用意されたアニメーションを利用することにより、より自然なユーザインタフェースを提供することができるようになります。
本プログラムでは、予定表を管理するために Hashtable クラス (ハッシュテーブル) を利用します。Hashtable クラスを利用すると、キーと値をひとつの組として配列状の記憶領域に情報を格納することができます。Hashtable クラスに格納した情報は、予め指定しておいたキーを利用することにより取り出すことができます。Hashtable クラスの概念を図 9 に示します。

図 9 : ハッシュテーブルの概念
本プログラムでは、予定表を管理する際に、年月日をキーとして、予定を格納します。そして、本日の予定確認機能が呼び出されたときは、本日の年月日をキーとして予定を取り出します。
1.3.6 予定確認・更新フォーム (Form2.cs) の作成
本プログラムでは、メインフォーム以外に、予定表の内容を更新するためのフォームとして、予定確認・更新フォームを作成します。
(1) フォームの追加
フォームをプロジェクトに追加するためには、次の手順で操作を行います。まず、メニューから、【プロジェクト】→【Windows フォームの追加】 を選択します。次に、【テンプレート】 の一覧の中から 【Windows フォーム】 を選択します。最後に、【開く】 ボタンをクリックすることにより、フォームが追加されます。
(2) コントロールの配置
予定確認・更新フォームのコントロール配置を図 10 に示します。

図 10 : 予定確認・更新フォームのコントロール配置
(3) プロパティの設定
各コントロールのプロパティには、次の値を設定します。予定確認・更新フォームに配置するコントロールのプロパティ設定を表 5 に示します。
表 5 : 予定確認・更新フォームに配置するコントロールのプロパティ設定
コントロール名 | プロパティ | 設定値 |
Form2 | Text | 予定確認・更新 |
| MaximizeBox | FALSE |
| MinimizeBox | FALSE |
textBox1 | Text | |
| Multiline | TRUE |
(4) イベントハンドラの追加
予定確認・更新フォームにイベントハンドラを設定します。追加するイベントハンドラの一覧を表 6 に示します。
表 6 : 追加するイベントハンドラ一覧表
コントロール名 | イベント名 | イベントハンドラ名 |
monthCalendar1 | DateSelected | monthCalendar1_DateSelected |
textBox1 | KeyUp | textBox1_KeyUp |
(5) ソースコードの追加
private void monthCalendar1_DateSelected(object sender, System.Windows.Forms.DateRangeEventArgs e)
{
// 選択された日に予定がある場合
if(hshSchedule[monthCalendar1.SelectionStart.ToString()] != null)
{
textBox1.Text = (string) hshSchedule[monthCalendar1.SelectionStart.ToString()]; // 予定テキストを表示
}
// 選択された日に予定がない場合
else
{
textBox1.Text = ""; // 予定テキストを削除
}
}
private void textBox1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
// 選択している日に予定がある場合
if(hshSchedule[monthCalendar1.SelectionStart.ToString()] != null)
{
hshSchedule[monthCalendar1.SelectionStart.ToString()] = textBox1.Text; // 予定を更新
}
// 選択している日に予定がない場合
else
{
hshSchedule.Add(monthCalendar1.SelectionStart.ToString(),textBox1.Text); // 予定を追加
}
}
public Hashtable hshSchedule; // 予定表管理用ハッシュテーブル
(6) ソースコードの解説
予定確認・更新フォームでは、予定表のデータを更新します。MonthCalendar コントロールにおいて、日にちがクリックされた場合、予定表管理用ハッシュテーブルに問い合わせを行い、その日の予定を表示します。
1.3.7 動作確認
本プログラムを実行すると、まず、エージェントが現れ、Pleased (喜ぶ) アニメーションを実行します。次に、エージェントをダブルクリックすると、Read (読む) アニメーションを実行しつつ、本日の予定を報告します。予定がない場合は、Confused (困惑) アニメーションを実行します。そして、Shift キーを押しながらエージェントをダブルクリックすると、Write (書く) を実行しつつ、予定確認・更新フォームを呼び出します。実行結果を図 11 に示します。

図 11 : 実行結果
1.4 おわりに
本章で紹介したとおり、MSAgent 技術を利用することにより、より自然なインタフェースをプログラム上で実現することができます。また、MSAgent 技術の面白いところは、短いソースコードで多彩な動作が実行できるところです。プログラムの勉強をするときに、面白みのない伝統的な数値計算での勉強に比べ、インタラクティブな動作を楽しめる教材として、MSAgent は最適であるといえます。
今後の連載の中でも、MSDN に用意された技術を利用し、プログラミングの楽しさを追求できる技術を紹介していきたいと思います。
Visual C# .NET による MSDNAA おもしろプログラミング
本コラムでは、MSDN や MSDNAA の中で公開されているリソースの中でも、プログラミングの楽しさを追及できるものを集めて紹介し、新しいオブジェクト指向言語 「Visual C#. NET」 での利用法を解説していきます。
著者略歴
田中 成典 (たなか しげのり)
1986 年 | 関西大学工学部土木工学科卒業 |
1988 年 | 関西大学大学院工学研究科 土木工学専攻博士課程前期課程修了 |
1996 年 | 博士 (工学) 授与,関西大学 |
1997 年 | 関西大学総合情報学部助教授 (現在に至る) |
主な著書: | やさしい C のはじめかた,オーム社,1993 年 |
| 建設技術者のための知識情報処理の実践,関西大学出版部,1999 年 |
| DirectX8,工学社,2001 年 |
| ステップアップ XML,工学社,2002 年 |
| Linux アプリケーション入門,森北出版,2002年 ほか |
中山 浩太郎 (なかやま こうたろう)
2001 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
2003 年 3 月 | 関西大学大学院総合情報学研究科 博士課程前期課程修了 |
2003 年 4 月 | 関西大学大学院総合情報学研究科 博士課程後期課程入学 (現在に至る) |
主な著書: | Web 工房シリーズ Perl の達人,森北出版,1999 年 |
| 決定版 Visual Basic,共立出版,2000年 |
| DirectX8,工学社,2001 年 |
| Linux アプリケーション入門,森北出版,2002 年 |
| ステップアップ Visual C# .NET 入門,工学社,2002 年 ほか |
中村 健二 (なかむら けんじ)
2000 年 4 月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
主な著書: | DirectX8 & VC++ 3D の基礎とゲームの作り方,工学社,2002年 |
北川 悦司 (きたがわ えつじ)
2000 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
2002 年 3 月 | 関西大学大学院総合情報学研究科 博士課程前期課程修了 |
2002 年 4 月 | 関西大学大学院総合情報学研究科 博士課程後期課程入学 (現在に至る) |
主な著書: | Web 工房シリーズ Java の達人,森北出版,1999 年 |
| デジカメ活用によるデジタル写真測量入門,森北出版,2000 年 |
| ステップアップ XML 活用法,工学社,2002 年 |
上山 智士 (うえやま さとし)
2002 年 4 月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
杉町 敏之 (すぎまち としゆき)
2003 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
2003 年 4 月 | 関西大学大学院総合情報学研究科入学 (現在に至る) |
主な著書: | ステップアップ Visual C# .NET 入門,工学社,2002 年 |
野中 一希 (のなか かずき)
2003 年 3 月 | 関西大学総合情報学部総合情報学科卒業 |
2003 年 4 月 | 関西大学大学院総合情報学研究科入学 (現在に至る) |
主な著書: | ステップアップ Visual C# .NET 入門,工学社,2002 年 |
|