Java Accessibilityガイド> ユーザー補助テクノロジ開発者向けJava Access Bridgeプログラマーズ・ガイド> Java Access Bridge API
Java Access Bridge APIを使用すると、Javaアプリケーションで機能する、Microsoft Windowsオペレーティング・システム向けユーザー補助テクノロジ・アプリケーションを開発できます。 これには、JavaアプリケーションのGUI要素についての情報(Java Access Bridge経由でユーザー補助テクノロジ・アプリケーションに転送される)を表示および操作できるネイティブ・メソッドが含まれています。
次の項目について説明します。
Java Access Bridge APIは、AccessBridgeCalls.h、AccessBridgePackages.h、およびAccessBridgeCallbacks.hの3つのファイルにあります。 これらのファイルは、Java Access Bridge API呼び出し、APIデータ構造、およびAPIコールバックにそれぞれ対応しています。
Java Access Bridge 2.0.2には、64ビット・システムをサポートするために新しいAPIセットが含まれます。 ただし、APIの変更はAPI呼出しに渡されるパラメータのみで、APIの名前は変更されていません。
ユーザー補助テクノロジのアプリケーションは、ソースで提供されている新しいヘッダー・ファイルで再コンパイルする必要があります。
jobject型のオブジェクトはjlongとして渡されるようになりました。 typedef JOBJECT64は、ACCESSBRIDGE_ARCH_LEGACYが定義されているかどうかに応じてjobjectまたはjlongのいずれかになります。 AccessBridgePackages.hヘッダー・ファイルを参照してください。
使用例については、JavaFerret.cppの例を参照してください。
void HandlePropertyChildChange( long vmID, PropertyChangeEvent event, AccessibleContext ac, JOBJECT64 oldChild, JOBJECT64 newChild); void HandlePropertyActiveDescendentChange( long vmID, PropertyChangeEvent event, AccessibleContext ac, JOBJECT64 oldActiveDescendent, JOBJECT64 newActiveDescendent);
Java Access Bridge API呼出しはAccessBridgeCalls.hに含まれていて、これらを使用するには使用しているアプリケーションとWindowsAccessBridge.dllとの間のインタフェースとして機能するファイルAccessBridgeCalls.cもコンパイルする必要があります。
これらの2つの関数はJava Access Bridgeを起動してシャットダウンします。
BOOL initializeAccessBridge();
Java Access Bridgeを起動します。 この関数を呼び出すまではJava Access Bridge APIのいずれの部分も使用できません。
BOOL shutdownAccessBridge();
Java Access Bridgeをシャットダウンします。 アプリケーションがJava Access Bridgeの使用を終了するときは、(アプリケーションが存在する前に)この関数を呼び出してJava Access Bridgeが正しくメモリー・クリーンアップを実行できるようにすることが重要です。
ノート: 関数shutdownAccessBridgeを呼び出すことは、JVMによって保持されているデータ構造を解放することの代わりにはならないため、関数ReleaseJavaObjectを呼び出すことでこれを行なってください。
通常はこれらの関数を呼び出してから、その他のJava Access Bridge API関数を呼び出します。
BOOL IsJavaWindow(HWND window);
指定されたウィンドウがJava Accessibility APIを実装しているかどうかを確認します。
BOOL GetAccessibleContextFromHWND(HWND target, long *vmID, AccessibleContext *ac);
指定されたウィンドウのAccessibleContextおよびvmID値を取得します。 多くのJava Access Bridge関数にはAccessibleContextおよびvmID値が必要です。
これらは、イベント・タイプを処理する関数への関数ポインタを取ります。 これらのタイプのイベントを受け取る必要がなくなった場合、関数を再度呼び出してNULL値を渡します。 ファイルAccessBridgeCallbacks.h内で、これらの関数に渡す必要がある関数ポインタのプロトタイプを探します。 これらのプロトタイプの詳細は、セクション「APIコールバック」を参照してください。
void SetFocusGained(AccessBridge_FocusGainedFP fp);
void SetFocusLost(AccessBridge_FocusLostFP fp);
使用可能な機能を判別するために、GetVersionInfo呼び出しからバージョン情報を取得できます。
void ReleaseJavaObject(long vmID, Java_Object object);
Javaオブジェクトobjectによって使用されるメモリーを解放します(objectはJava Access Bridgeによって返されるオブジェクト)。 Java Access BridgeはJVM内で返されるすべてのJavaオブジェクトへの参照を自動的に保持するため、それらはガベージ・コレクトされません。 メモリー・リークを防ぐには、Java Access Bridgeによって返されたすべてのJavaオブジェクトの使用が終了したら、それらに対してReleaseJavaObjectを呼び出す必要があります。 これの実行例については、JavaFerret.cを参照してください。
BOOL GetVersionInfo(long vmID, AccessBridgeVersionInfo *info);
アプリケーションが使用しているJava Access Bridgeインスタンスのインスタンス・バージョン情報を取得します。 この情報を使用して、Java Access Bridgeのバージョンの利用できる機能を判別できます。
ノート: JVMのバージョンを判別するには有効なvmIDを渡す必要があります。そうでない場合は返されるものはすべて、アプリケーションが接続されているWindowsAccessBridge.DLLファイルのバージョンです。
これらの関数は、Java Access Bridgeにより公開されるJava Accessibility APIのコア部分を提供します。
関数GetAccessibleContextAtおよびGetAccessibleContextWithFocusは、AccessibleContextオブジェクト(Accessibleオブジェクトへのマジック・クッキー(実際にはJava Object参照)とJVMクッキー)を取得します。 これらの2つのクッキーを使用して、Java Access Bridge経由でオブジェクトを参照します。 ほとんどのJava Access Bridge API関数には、これら2つのパラメータを渡す必要があります。
ノート: AccessibleContextオブジェクトは64ビット・プロセス間通信(ファイル名に-32および-64が付いたDLLおよびJARファイルを使用)での64ビット参照、AccessibleContextオブジェクトは32ビット・プロセス間通信(ファイル名に-32および-64が付いていないDLLおよびJARファイルを使用)での32ビット参照です。 したがって、64ビット・プロセス間通信を使用している場合は、ユーザー補助テクノロジ・アプリケーションを再コンパイルする必要があります。
関数GetAccessibleContextInfoは、JVMに属するAccessibleContextオブジェクトの詳細情報を返します。 パフォーマンスを向上させるために、Java Accessibility APIのさまざまな異なるメソッドが集められてJava Access Bridge APIのいくつかのルーチンにまとめられ、struct値で返されます。 これらのstruct値はファイルAccessBridgePackages.hで定義されており、セクション「APIコールバック」で説明されています。
関数GetAccessibleChildFromContextおよびGetAccessibleParentFromContextを使用すると、GUIコンポーネント階層をウォークして、特定のGUIオブジェクトのn番目の子(または親)を取得できます。
BOOL GetAccessibleContextAt(long vmID, AccessibleContext acParent, jint x, jint y, AccessibleContext *ac)
マウス・ポインタの下にあるウィンドウまたはオブジェクトのAccessibleContextオブジェクトを取得します。
BOOL GetAccessibleContextWithFocus(HWND window, long *vmID, AccessibleContext *ac);
フォーカスを持つウィンドウまたはオブジェクトのAccessibleContextオブジェクトを取得します。
BOOL GetAccessibleContextInfo(long vmID, AccessibleContext ac, AccessibleContextInfo *info);
AccessibleContextオブジェクトacのAccessibleContextInfoオブジェクトを取得します。
AccessibleContext GetAccessibleChildFromContext(long vmID, AccessibleContext ac, jint index);
オブジェクトacのn番目の子を表すAccessibleContextオブジェクトを返します(nは値indexで指定される)。
AccessibleContext GetAccessibleParentFromContext(long vmID, AccessibleContext ac);
オブジェクトacの親を表すAccessibleContextオブジェクトを返します。
これらの関数は、Java Accessibility APIによって提供されるAccessibleText情報を取得します(効率化のために7つのチャンクに分割されます)。 AccessibleContextInfoデータ構造内のaccessibleTextフラグがTRUEに設定されている場合、AccessibleContext内にAccessibleText情報が含まれます。 これらの関数で使用されるstruct値はファイルAccessBridgePackages.hで定義されており、セクション「APIコールバック」で説明されています。
BOOL GetAccessibleTextInfo(long vmID, AccessibleText at, AccessibleTextInfo *textInfo, jint x, jint y);
BOOL GetAccessibleTextItems(long vmID, AccessibleText at, AccessibleTextItemsInfo *textItems, jint index);
BOOL GetAccessibleTextSelectionInfo(long vmID, AccessibleText at, AccessibleTextSelectionInfo *textSelection);
char *GetAccessibleTextAttributes(long vmID, AccessibleText at, jint index, AccessibleTextAttributesInfo *attributes);
BOOL GetAccessibleTextRect(long vmID, AccessibleText at, AccessibleTextRectInfo *rectInfo, jint index);
BOOL GetAccessibleTextRange(long vmID, AccessibleText at, jint start, jint end, wchar_t *text, short len);
BOOL GetAccessibleTextLineBounds(long vmID, AccessibleText at, jint index, jint *startIndex, jint *endIndex);
これらの関数は、Java Accessibility APIによって提供されるAccessibleValue情報を取得します。 AccessibleContextInfoデータ構造内のaccessibleValueフラグがTRUEに設定されている場合、AccessibleContextオブジェクト内にAccessibleValue情報が含まれます。 返される値は文字列(char *value)です(値が、Java言語構造体java.lang.Numberをサブクラス化する整数、浮動小数点値、またはほかのオブジェクトであるかどうかを事前に判別できないため)。
BOOL GetCurrentAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
BOOL GetMaximumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_ *value, short len);
BOOL GetMinimumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_ *value, short len);
これらの関数は、Java Accessibility APIによって提供されるAccessibleSelection情報を取得および操作します。 AccessibleContextInfoデータ構造内のaccessibleSelectionフラグがTRUEに設定されている場合、AccessibleContext内にAccessibleSelection情報が含まれます。 AccessibleSelectionサポートは、照会時とは異なり、選択に対して項目を追加および削除することでユーザー・インタフェースを操作できる最初の場所です。 一部の関数は子座標にあるインデックスを使用し、その他は選択座標を使用します。 たとえば、子インデックスを渡すことにより、選択に対する追加または削除を行います(たとえば、4番目の子を選択に追加するなど)。 一方、選択された子の列挙は選択座標内で行われます(たとえば、選択された最初のオブジェクトのAccessibleContextを取得するなど)。
void AddAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
void ClearAccessibleSelectionFromContext(long vmID, AccessibleSelection as);
jobject GetAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
int GetAccessibleSelectionCountFromContext(long vmID, AccessibleSelection as);
BOOL IsAccessibleChildSelectedFromContext(long vmID, AccessibleSelection as, int i);
void RemoveAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
void SelectAllAccessibleSelectionFromContext(long vmID, AccessibleSelection as);
Java Access Bridge APIデータ構造はファイルAccessBridgePackages.hに含まれています。 このファイルには必要がない(および無視できる)データ構造があります。これらは2つのJava Access Bridge DLLのプロセス間通信メカニズムの一部として使用されます。 重要なデータ構造は次のとおりです。
#define MAX_STRING_SIZE 1024
#define SHORT_STRING_SIZE 256
struct AccessBridgeVersionInfo {
wchar_t VMversion[SHORT_STRING_SIZE]; // version of the Java VM
wchar_t bridgeJavaClassVersion[SHORT_STRING_SIZE]; // version of the
// AccessBridge.class
wchar_t bridgeJavaDLLVersion[SHORT_STRING_SIZE]; // version of
// JavaAccessBridge.dll
wchar_t bridgeWinDLLVersion[SHORT_STRING_SIZE]; // version of
// WindowsAccessBridge.dll
};
struct AccessibleContextInfo {
wchar_ name[MAX_STRING_SIZE]; // the AccessibleName of the object
wchar_ description[MAX_STRING_SIZE]; // the AccessibleDescription of the object
wchar_ role[SHORT_STRING_SIZE]; // localized AccesibleRole string
wchar_ states[SHORT_STRING_SIZE]; // localized AccesibleStateSet string
// (comma separated)
jint indexInParent // index of object in parent
jint childrenCount // # of children, if any
jint x; // screen x-axis co-ordinate in pixels
jint y; // screen y-axis co-ordinate in pixels
jint width; // pixel width of object
jint height; // pixel height of object
BOOL accessibleComponent; // flags for various additional
BOOL accessibleAction; // Java Accessibility interfaces
BOOL accessibleSelection; // FALSE if this object doesn't
BOOL accessibleText; // implement the additional interface
BOOL accessibleInterfaces; // new bitfield containing additional
// interface flags
};
struct AccessibleTextInfo {
jint charCount; // # of characters in this text object
jint caretIndex; // index of caret
jint indexAtPoint; // index at the passsed in point
};
struct AccessibleTextItemsInfo {
wchar_t letter;
wchar_t word[SHORT_STRING_SIZE];
wchar_t sentence[MAX_STRING_SIZE];
};
struct AccessibleTextSelectionInfo {
jint selectionStartIndex;
jint selectionEndIndex;
wchar_t selectedText[MAX_STRING_SIZE];
};
struct AccessibleTextRectInfo {
jint x; // bounding recttangle of char at index, x-axis co-ordinate
jint y; // y-axis co-ordinate
jint width; // bounding rectangle width
jint height; // bounding rectangle height
};
struct AccessibleTextAttributesInfo {
BOOL bold;
BOOL italic;
BOOL underline;
BOOL strikethrough;
BOOL superscript;
BOOL subscript;
wchar_t backgroundColor[SHORT_STRING_SIZE];
wchar_t foregroundColor[SHORT_STRING_SIZE];
wchar_t fontFamily[SHORT_STRING_SIZE];
jint fontSize;
jint alignment;
jint bidiLevel;
jfloat firstLineIndent;
jfloat leftIndent;
jfloat rightIndent;
jfloat lineSpacing;
jfloat spaceAbove;
jfloat spaceBelow;
wchar_t fullAttributesString[MAX_STRING_SIZE];
};
Java Access Bridge APIコールバックはファイルAccessBridgeCallbacks.hに含まれています。 イベント処理関数はこれらのプロトタイプに一致する必要があります。
ノート: すべてのJava Access Bridgeイベント・ハンドラは、Java Ferretの例で定義および使用されています。
これらのイベント・ハンドラの使用が終了したら、イベント・ハンドラにより返されたすべてのJOBJECT64に対して関数ReleaseJavaObjectを呼び出し、JVMのメモリー・リークを防ぐ必要があります。
ここで、JOBJECT64は64ビット・システムではjlong、レガシー・バージョンのJava Access Bridgeではjobjectとして定義されています。 定義については、AccessBridgePackages.hヘッダー・ファイルのセクションACCESSBRIDGE_ARCH_LEGACYを参照してください。
レガシーAPIを使用する場合は、ACCESSBRIDGE_ARCH_LEGACYを定義してください。 AccessBridgePackages.hヘッダー・ファイルを参照してください。
typedef void (*AccessBridge_FocusGainedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_FocusLostFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_CaretUpdateFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_MouseClickedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_MouseEnteredFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_MouseExitedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_MousePressedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_MouseReleasedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_MenuCanceledFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_MenuDeselectedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_MenuSelectedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_PopupMenuCanceledFP) (long vmID JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_PopupMenuWillBecomeInvisibleFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_PopupMenuWillBecomeVisibleFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_PropertyNameChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source, wchar_t *oldName, wchar_t *newName);
typedef void (*AccessBridge_PropertyDescriptionChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source, wchar_t *oldDescription, wchar_t *newDescription);
typedef void (*AccessBridge_PropertyStateChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source, wchar_t *oldState, wchar_t *newState);
typedef void (*AccessBridge_PropertyValueChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source, wchar_t *oldValue, wchar_t *newValue);
typedef void (*AccessBridge_PropertySelectionChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_PropertyTextChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_PropertyCaretChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source, int oldPosition, int newPosition);
typedef void (*AccessBridge_PropertyVisibleDataChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
typedef void (*AccessBridge_PropertyChildChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source, JOBJECT64 oldChild, JOBJECT64 newChild);
typedef void (*AccessBridge_PropertyActiveDescendentChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source, JOBJECT64 oldActiveDescendent, JOBJECT64 newActiveDescendent);