Active Accessibility サポート
Microsoft Corporation
日本語版最終更新日 2001 年 5 月 31 日
この記事では、Microsoft® Internet Explorer の MSHTML コンポーネントが提供する Active Accessibility SDK サポートの概要を示します。
ユーザー補助は、障害のある方によるコンピュータの使用を支援するアプリケーションです。Active Accessibility により、ユーザー補助はオペレーティング システムや他のアプリケーションと共通のインターフェイスを通して通信できるようになります。Active Accessibility API は、ユーザー補助とアクセシビリティ対応アプリケーションの統合をサポートします。
ユーザー補助には 2 つのタイプがあります。1 つは、スクリーン上の情報を拡大し、テキストやその他の視覚的要素を解釈したオーディオ情報を提供するものです。これらのユーザー補助は、視覚に障害のある方に役立ちます。もう 1 つのタイプには、運動能力に障害のあるユーザーをサポートするハードウェアおよびソフトウェア ツールで、各種のキーボード ドライバ ソフトウェアや、代替入力デバイス、すなわちキーボードやマウス以外のデバイスの使用を可能にします。
Active Accessibility は、Internet Explorer 4.01 以降に含まれている
MSHTML ダイナミック リンク ライブラリを通して HTML をサポートします。
MSDN Online Library の Microsoft® Platform Software Development Kit (SDK) には、Active Accessibility の概要と、詳しい API リファレンスが含まれています。この Active Accessibility API リファレンスは、IAccessible インターフェイスと Active Accessibility イベント、および Active Accessibility オブジェクト モデルの他の部分をドキュメント化しています。また、Platform SDK にはサンプルとチュートリアルも含まれています。
前提条件と要件
このドキュメンテーションでは、読者が Microsoft® Win32® プログラミングに習熟しているものと仮定しています。また、コンポーネント オブジェクト モデル (COM) プログラミングに関する知識も必要です。
Active Accessibility が提供する機能を使用する C/C++ プログラムをコンパイルするときには、Oleacc.h ヘッダー ファイルがコンパイラのインクルード ディレクトリに含まれていることを確認してください。アクセス可能なオブジェクトへのインターフェイスは IDispatch インターフェイスを実装しているので、Active Accessibility メソッドは Microsoft® Visual Basic® ベースのアプリケーションでも実装することができます。
ユーザー補助のバックグラウンド
アプリケーションで Active Accessibility をサポートすることにより、推定 5 千万人の障害のあるユーザーを含むあらゆる人がソフトウェアを使用できるようになります。
Active Accessibility がリリースされる以前は、ユーザー補助の開発者は、必要な情報を入手するために、わかりにくいフック メカニズムを使用するか、オペレーティング システムのコードを回避するクリエイティブな方法を考案する必要がありました。一般に、開発者はこれに成功していましたが、アプリケーションはオペレーティング システムのバージョンごとに変わる可能性のあるインプリメンテーション上の細部に依存することになりました。
Active Accessibility は、COM テクノロジを利用することで、高性能で信頼の置けるツールを作成する手段を提供します。これにより、アプリケーションとユーザー補助は、連係して特殊なニーズを持つユーザーを支援できるようになります。Active Accessibility は、信頼性の低い回避法を不要にするインターフェイス、ライブラリ、およびその他の要素を含んだ包括的なオブジェクト モデルを提供します。
Internet Explorer 4.01 以降における Active Accessibility
Internet Explorer 4.01 の MSHTML コンポーネントは、Microsoft Active Accessibility Proxy for HTML、すなわち HTML Proxy をサポートしています。HTML Proxy は、オブジェクト モデルのインターフェイスとイベントを通して MSHTML と通信し、Web ページのコンテンツのアクセス可能な表現を提供します。
Internet Explorer 5 以降の MSHTML コンポーネントは、HTML Proxy の代わりに、Active Accessibility のネイティブなインプリメンテーションを公開しています。Active Accessibility のネイティブなインプリメンテーションのおかげで、特に大きな Web ページのパフォーマンスが大幅に改善されています。また、このインプリメンテーションは HTML Proxy のインプリメンテーションと比べるとはるかに堅牢です。Internet Explorer 5 以降は、パフォーマンスと安定性の点で向上しています。
アクセス可能な HTML 要素
アプリケーションは、自分のユーザー インターフェイス (UI) 要素をクライアント アプリケーションに公開することで Active Accessibility をサポートします。これらの UI 要素は、アクセス可能なオブジェクトの形でクライアント アプリケーションに提示されます。アクセス可能なオブジェクトは、オブジェクトの外見、性質、および目的を記述する、プロパティと呼ばれる情報の断片を保持しています。
IAccessible インターフェイスは、ユーザー補助クライアントがこれらのプロパティを取得するために使用するメソッドを拡張しています。これらのプロパティが提供する情報を使って、ユーザー補助はユーザーにとって貴重な情報を入手し、必要に応じてユーザーに伝えることができます。MSHTML は、クライアント ユーザー補助に HTML 要素を公開することで、Active Accessibility をサポートします。
HTML 要素の中には、アクセス可能なもの (画像、テキスト、およびリンク) とそうでないものがあります。アクセス可能であるとは、HTML ドキュメント内のその要素の個々のインスタンスが、ドキュメントのアクセシビリティ階層の中で独自のアクセス可能な表現を持っているということを意味します。
Internet Explorer 4.01 の時点で利用可能なアクセス可能な HTML 要素とアクセス不可能な HTML 要素のリストについては、DHTML Accessibility を参照してください。
アクセス不可能な要素をアクセス可能にする方法
アクセス可能でない要素は無視され、ドキュメントのアクセシビリティ階層から除外されます。これらの要素は、HTML ドキュメント内のデータを表現するテキスト ストリームのブレーキング ポイントとして扱われます。これらは、それを含んでいる要素の子として扱われます。
アクセス可能な要素は、それらだけではアクセス可能な Web ページの作成のための完全なソリューションとはなりません。Internet Explorer 5 では、値が 0 よりも大きい tabIndex プロパティを持つすべての要素がアクセス可能と見なされます。Internet Explorer 5.01 およびそれ以降では、この機能が拡張されています。tabIndex プロパティが設定されていれば、その値には関係なく、要素はアクセシビリティ階層に取り込まれます。
MSHTML では、ユーザーは TAB キーを使って、ページ上のフォーカスを受け取れる要素に移動することができます。
MSHTML は適切な EVENT_OBJECT_FOCUS イベントを送信します。Active Accessibility クライアントは AccessibleObjectFromEvent を使って、フォーカスを受け取った子要素に関する情報を取得することができます。
アクセシビリティのビヘイビア
要素に対してアクセス可能なオブジェクトが要求されたとき、その要素がエレメント ビヘイビアを持っていた場合、アプリケーションはまずそのビヘイビアがアクセシビリティ サポートを実装しているかどうかをチェックします。ビヘイビアがアクセシビリティをサポートしている場合、アクセシビリティに関するクエリはそのビヘイビアに委譲されます。ただし、ビヘイビアがエラー コードを返した場合には、このエラー コードはクライアントに返されます。ビヘイビアが E_NOTIMPL エラー コードを返した場合、Active Accessibility は他の要素での代替を試みます。
アクセス可能な HTML イベント
MSHTML は、オブジェクト モデル イベントの結果として、特定のアクセシビリティ イベントを発生します。次の表は、これらのイベントと、それに対応する Active Accessibility のイベントを示しています。
MSHTML の起動後にアクセシビリティ クライアントが起動された場合、クライアントはこれらのイベントを使って MSHTML の Active Accessibility インプリメンテーションに接続し、コンテンツの公開を開始することができます。個々のイベントは、ウィンドウと、ウィンドウ内のイベントの発生先である要素を示すウィンドウ ハンドルと参照値を含んでいます。ウィンドウそのものについては、一意の識別子はゼロです。その他のすべての要素については、すべてのイベントが発生時に同じウィンドウ ハンドルを含んでいたとしても、参照は要素の一意の識別子を含んでいます。後に、クライアント アプリケーションはウィンドウ ハンドルと参照番号を指定して Active Accessibility のシステム コンポーネントをコールバックします。その後、Active Accessibility はその要素の一意の識別子を MSHTML インプリメンテーションに伝えます。
HTML ドキュメントの中のアクセス可能なオブジェクトと子要素
MSHTML は、HTML ファイルを解析し、Web ページをユーザーのディスプレイにレンダリングする Internet Explorer のコンポーネントです。MSHTML は、Web ページの HTML 要素を表現する DHTML (Dynamic HTML) オブジェクト モデルに加えて、Active Accessibility IAccessible インターフェイスを通してアクセス可能なオブジェクトを公開します。
このセクションでは、HTML 要素とそれに対応するアクセス可能オブジェクトの関係について説明します。
アクセシビリティ階層
Internet Explorer の MSHTML コンポーネントは、アクセス可能な HTML 要素を、アクセス可能なオブジェクトの階層として公開します。個々のアクセス可能なオブジェクトは、IAccessible インターフェイスを実装し、自分自身とその子要素に関する情報を提供します。以下の条件が、MSHTML が公開しているアクセシビリティ階層を決定しています。
次の HTML の例は、アクセス不可能な HTML 要素が、それに含まれているテキストから子要素をどのように作成するかを決定する方法を示しています。
<HTML><BODY>Here is some <B>bold text</B></BODY></HTML>
b 要素はアクセス不可能な要素で、テキストの一部を区別するために使用されています。結果として得られるアクセシビリティ階層は、BODY 要素と 2 つの子要素を表すアクセス可能なオブジェクトから構成されます。アクセシビリティ階層は次のようになります。
BODY (accessible object)
+ "Here is some " (child element)
+ "bold text" (child element)
アクセス可能なオブジェクトのプロパティ
個々のアクセス可能なオブジェクトは、IAccessible インターフェイスによって定義されている記述型のプロパティを通して、追加の情報を提供します。これらのプロパティのいくつかの値は、HTML 要素で使用されている属性や、ユーザーの選択範囲とフォーカスに依存します。
IAccessible::get_accRole メソッドから返されるプロパティは、アクセス可能なオブジェクトのユーザー インターフェイス上の役割を記述します。次の表に、MSHTML が個々の HTML 要素に対して返す値を示します。
記述型のプロパティと役割定数の詳細については、
Active Accessibility SDK
ドキュメンテーションを参照してください。
注 個々の要素の記述型プロパティの使用可能な値を調べるには、Active Accessibility Software Development Kit (SDK) に付属している Internet Explorer ユーティリティを使用してください。
階層的なナビゲーション
ユーザー補助は、IAccessible::get_accParent、IAccessible::get_accChild、および IAccessible::get_accChildCount メソッドを呼び出すことで、MSHTML アクセシビリティ階層をナビゲートすることができます。アクセシビリティ階層をナビゲートするためのツールとサンプルについては、Active Accessibility SDK を参照してください。
注 MSHTML は、現時点では、アクセス可能なオブジェクトにアクセスするための代替方式である IEnumVariant を実装していません。
論理的なナビゲーション
アプリケーションは Active Accessibility を使って、ユーザーのアクションに応じてユーザー フォーカスをアクセス可能なオブジェクトの間で移動することができます。たとえば、ユーザー補助は、ユーザーが入力デバイスを使って、コントロール間でタブ移動を行えるようにすることができます。ユーザー補助は IAccessible::accNavigate メソッドを呼び出すことで、アクセス可能なオブジェクトの間でナビゲートします。MSHTML は以下のナビゲーション定数をサポートしています。
| 識別子 | 説明 |
|---|
| NAVDIR_FIRSTCHILD | アクセス可能なオブジェクトの最初の子にナビゲートします。 | | NAVDIR_LASTCHILD | アクセス可能なオブジェクトの最後の子にナビゲートします。 | | NAVDIR_NEXT | 次のアクセス可能なオブジェクトにナビゲートします。 | | NAVDIR_PREVIOUS | 前のアクセス可能なオブジェクトにナビゲートします。 |
ヒット テスト
アプリケーションは Active Accessibility を使って、特定のスクリーン位置にあるアクセス可能なオブジェクトと子要素を識別することができます。たとえば、ユーザー補助はカーソルの下の領域を拡大することで、画面を見やすくすることができます。このヒット テストと呼ばれるテクニックには、2 つのアプローチがあります。
AccessibleObjectFromPoint を呼び出して、特定のポイントにある最低レベルのアクセス可能なオブジェクトの IAccessible インターフェイスを取得する。
IAccessible::accHitTest を呼び出して、アクセス可能なオブジェクトまたは子要素がヒットしたかどうかをテストする。IAccessible::accHitTest の MSHTML インプリメンテーションは以下の識別子を返します。
| バリアント型 | 値 | 位置 |
|---|
| VT_I4 | CHILD_SELF | アクセス可能なオブジェクトの中にあるが、子要素または子のアクセス可能オブジェクトの中にはない。 | | VT_I4 | 子要素の ID | 子要素の中にある。 | | VT_DISPATCH | アクセス可能オブジェクトの IDispatch インターフェイス | 子のアクセス可能オブジェクトの中にある。 | | VT_EMPTY | なし | アクセス可能なオブジェクトの外にある。 |
CHILD_SELF または子識別子が返されるまで、返された個々のオブジェクト インターフェイス ポインタに対して IAccessible::accHitTest メソッドを呼び出します。識別子の値が CHILD_SELF ならば、アクセス可能なオブジェクトがヒットしています。そうでなければ、子識別子によって指定される子要素がヒットしています。
アクセス可能なオブジェクトに関連付けられている Internet Explorer オブジェクトへのアクセス
次のコード サンプルは、Active Accessibility モデルから Internet Explorer オブジェクト モデルを取得する方法を示しています。 -
ステップ 1: ページ、またはドキュメントのアクセス可能なウィンドウの中の要素への IAccessible ポインタを取得します。たとえば、"Internet Explorer_Server" という名前のウィンドウ クラスに含まれる任意のオブジェクトの IAccessible インターフェイスを取得します。 -
ステップ 2: 取得したアクセス可能なオブジェクトの IServiceProvider インターフェイス ポインタを取得します。 HRESULT hr;
hr = pAcc->QueryInterface(IID_IServiceProvider, (void **)&pSP); -
ステップ 3: ステップ 1 と 2 で取得したオブジェクトは、要素またはウィンドウです。どちらの場合でも、次のコードを使って Internet Explorer オブジェクト モデルのオブジェクトにアクセスすることができます。
HRESULT hr;
IHTMLWindow2 * pWindow;
IHTMLElement * pElement;
hr = pSP->QueryService(IID_IHTMLWindow2, IID_IHTMLWindow2,
(void **)&pWindow);
if (FAILED(hr))
hr = pSP->QueryService(IID_IHTMLElement, IID_IHTMLElement,
(void **)&pElement);
// サービス プロバイダ インターフェイス ポインタを解放する
pSP->Release();
if (SUCCEEDED(hr))
{
// ウィンドウまたは要素ポインタが返された
assert( pWindow || pElement);
....
code here...
// ポインタを解放する
if (pElement)
pElement->Release();
if (pWindow)
pWindow->Release();
}
上の例で、IServiceProvider::QueryService 呼び出しは、サービスのグローバル ユニーク識別子 (GUID) (第 1 パラメータ) とインターフェイス ID (第 2 パラメータ) に同じインターフェイス識別子 (IID) 値を使用しています。IServiceProvider::QueryService がウィンドウを返し、IID_IHTMLWindow2 が存在する場合には、IID をウィンドウへの
QueryInterface 呼び出しとして処理します。IID では、任意のインターフェイスを要求することができます。オブジェクトがインターフェイスを実装していれば、そのインターフェイスへのポインタを取得することができます。第 1 の GUID は、呼び出し側が、取得したオブジェクトが要素とウィンドウのどちらだったのかを判断する目的で、オブジェクトをフィルタリングするために使用することができます。この直接的な委譲により、アプリケーションの実行時間が節約されます。アプリケーションがすでに IAccessible の role プロパティをチェックし、IHTMLWindow2 ではなく IUnknown または IHTMLWindow3 を必要とするウィンドウ オブジェクトであることを発見した場合、呼び出しは第 2 パラメータとして IID_IUnknown または IID_IHTMLWindow3 を渡します。
パフォーマンス上のヒント
以下のヒントを使って、ユーザー補助のパフォーマンスを改善することができます。
- EVENT_OBJECT_CREATE イベントの処理には第 2 のスレッドを使用することを検討してください。これにより、ユーザー補助は、サーバーがアクセシビリティ階層を構築するのを待たずに、自分のユーザー インターフェイスを表示することができます。
- IAccessible::accHitTest メソッドを呼び出すときには、ヒット テストで取得した情報をキャッシングして、アクセシビリティ階層に何度もアクセスするのを避けることを検討してください。
- Active Accessibility メソッドから返されたすべての IDispatch インターフェイス ポインタを解放することで、メモリとリソースを不必要に使用することを避けます。
- ユーザー補助が EVENT_OBJECT_DESTROY イベントを受け取ったときには、現在のウィンドウに関連するすべてのリソースを解放することを検討してください。
- 表示されないアクセス可能なオブジェクトは無視します。アクセス可能なオブジェクトの現在の状態は、IAccessible::get_accState を呼び出すことでチェックすることができます。
状態が STATE_SYSTEM_INVISIBLE ならば、オブジェクトは非表示になっています。MSHTML は、要素の可視性がスクリプトを通して変更されたときには EVENT_OBJECT_STATECHANGE イベントを発生しますが、ユーザーがウィンドウのサイズを変更したときにはこのイベントを発生しません。
- Active Accessibility をネイティブにサポートし、パフォーマンスも改善されている Internet Explorer 5 を使用することを検討してください。
|