第 2 回 VC# で MSHTML
〜 Visual C# .NET による MSDNAA おもしろプログラミング 〜
1.1 はじめに
近年、Web の利用者が爆発的に増加すると共に、Web ブラウザは高機能化・高性能化の一途を辿ってきました。Microsoft 社が開発した Internet Explorer は、数ある Web ブラウザの中でも利用者が最も多く、非常に優れた機能を数多く実装しています。
Microsoft 社では、この Internet Explorer の優れた機能をコンポーネント化 (部品化) し、開発者用ネットワークである MSDN の中で情報を提供しています。この Internet Explorer のコンポーネントは、MSHTML テクノロジと呼ばれ、Internet Explorer の高度なレンダリング機能や HTML のパーサ機能などをアプリケーションに組み込んで利用できます。そこで、本章では、MSHTML テクノロジを Visual C# のアプリケーションから利用する方法を解説します。本章では MSHTML テクノロジの技術の中でも特に HTML 文書のレンダリング機能について解説します。
1.2 MSHTML テクノロジ
1.2.1 Internet Explorer と MSHTML
Internet Explorer は、非常に多くの機能を実装していると同時に、高速性・安定性・柔軟性などの点から見ても高い性能を持っているため、世界中で最も利用者の多いWeb ブラウザとしての地位を確立しています。特に、Internet Explorer の HTML 解析機能は、規格から外れた HTML であっても、多少のエラーは読み飛ばしてコンテンツを表示する頑健性を持っています。
Microsoft 社では、このように高機能・高性能を誇る Internet Explorer の機能をコンポーネント化して、MSHTML テクノロジという総称で開発者に提供しています。開発者は MSHTML テクノロジを利用することにより、Internet Explorer のHTML 構文解析機能やブラウザ機能をアプリケーションから利用することが可能になるため、プログラミングの幅が大きく広がります。例えば、HTML 文書の中からリンク部分だけを抽出してチェックを行うデッドリンクチェッカーや、Web を自動巡回するロボットプログラムなどを簡単に開発することができます。また、オリジナルの Web ブラウザを開発することも可能です。
MSHTML は、大きく分けて HTML パーサと HTML レンダリングエンジンから構成されています。HTML パーサは、HTML の構文を解析し、プログラムから利用しやすいように HTML 文書の情報を階層構造化します。また、 HTML レンダリングエンジンは、人間が解読しにくいタグ文書を表や画像などの形にレンダリングし、人間が閲覧しやすい形で表示を行います。MSHTML の概念を図 1 に示します。

図 1 : MSHTML の概念
1.2.2 MSHTML と Visual C#
MSHTML のコンポーネントは、ActiveX (COM) の DLL として開発されています。そのため、COM や ActiveX などの従来の Windows 環境でのコンポーネント技術を利用できる Visual C# からも利用することができます。
1.2.3 Web ブラウザコントロール
MSHTML は大きく分けて、HTML の構文を解析する HTML パーサと描画を行う HTML レンダリングエンジンから構成されています。このうち、HTML レンダリングエンジンの機能をコントロールとしてまとめたものが Web ブラウザコントロールです。Web ブラウザコントロールを利用することにより、Internet Explorer のような Web ブラウザ機能をアプリケーションに組み込むことができます。Web ブラウザコントロールを利用したアプリケーションを図 2 に示します。

図 2 : Web ブラウザコントロールを利用したアプリケーション
1.2.4 HTML と HTML パーサ
通常、HTML や XML などのタグ文書を扱うアプリケーションを開発する場合には、タグ文書は直接扱わず、構文解析するパーサを利用するのが一般的です。特に、最近では XML 文書を構文解析するための 「XML パーサ」 や 「XML DOM」 が数多く開発されていますが、HTML にも、構文解析をするための HTML パーサが存在します。HTML パーサを利用することにより、プログラムから HTML の構造や内容を抽出することや、編集することができます。例えば、HTML パーサを利用すれば、HTML 内の A タグの href 属性だけを抽出することなどは非常に容易であるため、ページ内のデッドリンクを調査するデッドリンクチェッカーを開発することは非常に簡単です。また、Web サイトの自動巡回ロボット、アクセシビリティチェッカーやユーザビリティチェッカーなどのプログラムにも HTML パーサの技術は利用されています。HTML パーサの概念を図 3 に示します。

図 3 : HTML パーサ
MSHTML の HTML パーサ機能については、次章で詳しく解説します。
1.2.5 Web オーサリング機能
MSHTML テクノロジの醍醐味として、Web オーサリング機能があります。Web オーサリング機能を利用することにより、Frontpage などのような WYSIWYG (What You See Is What You) 形式のインタフェースをアプリケーションに実装することができます。
1.3 オリジナル簡易 Web ブラウザ
1.3.1 オリジナル簡易 Web ブラウザの概要
本節では、実際に Web ブラウザコントロールを利用して簡易 Web ブラウザを開発します。簡易 Web ブラウザの完成イメージを図 4 に示します。

図 4 : 簡易 Web ブラウザの完成イメージ
簡易 Web ブラウザに実装する機能を表 1 に示します。
表 1 : 簡易 Web ブラウザに実装する機能
| 機能名 | 説明 |
| URL へのジャンプ機能 | 指定した URL へジャンプ |
| ホームページへのジャンプ機能 | Internet Explorer で設定しているホームページへジャンプ |
| 戻る機能 | ひとつ前のページへ移動 |
| 進む機能 | ひとつ次のページへ移動 |
| 検索サイトへのジャンプ機能 | Internet Explorer で設定している検索サイトへジャンプ |
| タイトルの表示機能 | HTML 内の title タグの内容をタスクバーに表示 |
1.3.2 プロジェクトの作成
Visual Studio.NET を起動し、スタートページから【新しいプロジェクト】 ボタンをクリックします。【プロジェクト】 の種類には 【Visual C# プロジェクト】 を選択し、【テンプレート】 の種類には 【Windows アプリケーション】 を選択します。プロジェクトの作成方法を図 5 に示します。

図 5 : プロジェクトの作成方法
1.3.3 コントロールの追加・参照設定
Web ブラウザコントロールと MSHTML のオブジェクト群をプログラムの中で利用するためには、コントロールの追加と参照の設定を行う必要があります。
(1) Web ブラウザコントロールの追加
Web ブラウザコントロールをツールボックスに追加するためには、まずツールボックスを右クリックし、【ツールボックスのカスタマイズ】 を選択します。次に、【ツールボックスのカスタマイズウィンドウ】 で、【COM コンポーネント】 の中から、【Microsoft Web Browser】 を選択します。最後に OK ボタンをクリックすると、ツールボックスに Web ブラウザコントロールが追加されます。
(2) 参照設定
MSHTML のオブジェクト群に対する参照の設定を行うためには、まずメニューから 【プロジェクト】→【参照の追加】 を選択します。次に、参照の追加ウィンドウで、【COM コンポーネント】 の中から、【Microsoft HTML Object Library】 を追加します。Web ブラウザコントロールと参照設定の方法を図 6 に示します。

図 6 : コントロールの追加と参照の設定
1.3.4 フォームの作成
(1) コントロールの配置
フォームには、図 7 に示すようにコントロールを配置します。

図 7 : コントロールの配置
(2) プロパティの設定
各コントロールのプロパティには、次の値を設定します。フォームに配置するコントロールのプロパティ設定を表 2 に示します。
表 2 : フォームに配置するコントロールのプロパティ設定
| コントロール名 | プロパティ | 設定値 |
| textBox1 | (Name) | txtURL |
| | Text | (なし) |
| button1 | (Name) | btnMove |
| | Text | 移動 |
| button2 | (Name) | btnBack |
| | Text | 戻る |
| button3 | (Name) | btnForward |
| | Text | 進む |
(3) メニューの作成
本プログラムでは、MainMenu コントロールを利用してメニューを実装します。メニューの作成方法を図 8 に示します。

図 8 : メニューの作成
各メニュー項目の設定を表 3 に示します。
表 3
| メニュー名 | メニュー項目名 | 表示するテキスト |
| menuItem1 | mnuBrowserHome | ホームページへ移動 |
| menuItem2 | mnuBrowserSearch | 検索エンジンへ移動 |
| menuItem3 | mnuBrowserEdit | HTML 編集 |
(4) イベントハンドラの追加
フォームにイベントハンドラを設定します。追加するイベントハンドラの一覧を表 4 に示します。
表 4 : 追加するイベントハンドラ一覧表
| コントロール名 | イベント名 | イベントハンドラ名 |
| btnMove | Click | btnMove_Click |
| btnBack | Click | btnBack_Click |
| btnForward | Click | btnForward_Click |
| mnuBrowserHome | Click | mnuBrowserHome_Click |
| mnuBrowserSearch | Click | mnuBrowserSearch_Click |
| mnuBrowserEdit | Click | mnuBrowserEdit_Click |
| axWebBrowser1 | NavigateComplete2 | axWebBrowser1_NavigateComplete2 |
(5) ソースコードの追加
フォームに記述するソースコードを次に示します。
private void mnuBrowserHome_Click(object sender, System.EventArgs e)
{
axWebBrowser1.GoHome(); // ホームページへジャンプ
}
private void btnForward_Click(object sender, System.EventArgs e)
{
try
{
axWebBrowser1.GoForward(); // 進む
}
catch(Exception ee)
{
MessageBox.Show("これ以上は進めません"); // エラーメッセージ
}
}
private void btnMove_Click(object sender, System.EventArgs e)
{
object oNull = null; // NULLオブジェクトの生成
axWebBrowser1.Navigate(txtURL.Text,ref oNull, ref oNull,ref oNull,ref oNull); // 移動
}
private void btnBack_Click(object sender, System.EventArgs e)
{
try
{
axWebBrowser1.GoBack(); // 戻る
}
catch(Exception ee)
{
MessageBox.Show("これ以上は戻れません"); // エラーメッセージ
}
}
private void mnuBrowserEdit_Click(object sender, System.EventArgs e)
{
mshtml.HTMLDocument myDocument =
(mshtml.HTMLDocument)axWebBrowser1.Document; // ドキュメントオブジェクトの取得
myDocument.designMode = "On"; // 編集モード開始
}
private void mnuBrowserSearch_Click(object sender, System.EventArgs e)
{
axWebBrowser1.GoSearch(); // 検索エンジンへジャンプ
}
private void axWebBrowser1_NavigateComplete2(object sender,
AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event e)
{
mshtml.HTMLDocument myDocument =
(mshtml.HTMLDocument)axWebBrowser1.Document; // ドキュメントオブジェクトの取得
this.Text = myDocument.title; // タイトルの表示
}
}
}
(6) ソースコードの解説
本プログラムでは、Web ブラウザコントロールに用意された様々なメソッドやプロパティを利用します。本プログラムの各機能で利用するメソッドおよびプロパティを表 5 に示します。
表 5 : Web ブラウザコントロール
| 機能名 | 利用するメソッド・プロパティ |
| URL へのジャンプ機能 | Navigate メソッド |
| ホームページへのジャンプ機能 | GoHome メソッド |
| 戻る機能 | GoBack メソッド |
| 進む機能 | GoForwardメソッド |
| 検索サイトへのジャンプ機能 | GoSearch メソッド |
| タイトルの表示機能 | Document プロパティ |
Navigate メソッドは、第一引数に渡した URL の HTML を Web ブラウザコントロールに表示します。Navigate メソッドの構文を次に示します。
|
Web ブラウザコントロール.Navigate (string URL, object フラグ, object 対象フレーム, object ポストデータ, object ヘッダー)
|
第二引数以降は、省略することが可能です。引数を省略する場合は、null 値を代入した object 変数を渡します。
GoHome メソッド、GoSearch メソッドを利用することにより、ホームページや検索エンジンに移動することができます。また、GoBack メソッド、GoForward メソッドを利用することにより、ひとつ前のページやひとつ後ろのページに移動することができます。これらのメソッドには引数はありません。
Document プロパティは、現在 Web ブラウザコントロールに表示している HTML 文書の内容にアクセスするためのプロパティです。Document プロパティを利用することにより、HTML 文書のタイトル、文字コード、文書構造などを参照することができます。
1.4 おわりに
本章では、Microsoft 社が開発したWeb ブラウザ Internet Explorer のコンポーネントである Web ブラウザコントロールの利用方法を解説しました。Web ブラウザコントロールをはじめとする MSHTML テクノロジを利用することにより、アプリケーションから Internet Explorer が持つ HTML の解析・レンダリング機能が利用できます。開発者は、Web の研究やアプリケーション開発をする上で必要となる HTML の構文解析技術やレンダリング技術に必要なプログラミング量を激減させることができます。本章では、レンダリング機能を中心に解説しましたが、次章では MSHTML の HTML 解析機能について解説します。
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 年 |
|