[ad_1]
Java ウィンドウのフィールドにテキストを送信する際に、Java Access Bridge (windows access bridge DLL) を使用しています。 API を初期化し、Java ウィンドウを正常に検出しました (これは、「isJavaWindow」関数への 2 回目の呼び出しでのみ正しく機能します)。 「getAccessibleContextFromHWND」を介してアクセス可能なコンテキストを取得できます。 次に、コンテキストを使用して、問題のテキスト ボックスが見つかるまで子を再帰します。 「getTextInfo」関数を使用してフィールドの内容を読み取ることができ、「getAccessibleContextInfo」関数は適切なデータを返しています。 このフィールドのプロパティは、accessibleContextInfo データ構造を介して編集可能であることがわかりますが、「setTextContents」関数は常に false を返します。 C# でのコード スニペットの使用法を次に示します (Autoit も使用してみました) API バージョン 2.0.2
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // enumerate the windows JavaAPIFunc.Windows_run(); bool found = false; Int32 VmId = 0; AccessibleContext Ac = new AccessibleContext(); AccessibleContextInfo Info = new AccessibleContextInfo(); foreach (KeyValuePair<intptr,> lWindow in OpenWindowGetter.GetOpenWindows()) { IntPtr lHandle = lWindow.Key; string lTitle = lWindow.Value; if (JavaAPIFunc.isJavaWindow((HWND)lHandle)) { MessageBox.Show("Found a java window"); JavaAPIFunc.getAccessibleContextFromHWND(lHandle, out VmId, out Ac); found = true; break; } } if(found) { TraverseTheBullshitInterface(VmId, Ac); } } private AccessibleContext TraverseTheBullshitInterface(Int32 VmId ,AccessibleContext AccessContext) { AccessibleContextInfo Info = new AccessibleContextInfo(); AccessibleTextItemsInfo TextInfo = new AccessibleTextItemsInfo(); JavaAPIFunc.getAccessibleContextInfo(VmId, AccessContext, ref Info); if (Info.name == "User name:" && Info.role_en_US == "text") { JavaAPIFunc.getAccessibleTextItems(VmId, AccessContext, ref TextInfo, 0); if(!JavaAPIFunc.setTextContents(VmId, AccessContext, "test")) { throw new Exception("Error setting text"); } } for (int i = 0; i < Info.childrenCount; ++i) { TraverseTheBullshitInterface(VmId,JavaAPIFunc.getAccessibleChildFromContext(VmId, AccessContext, i)); } return AccessContext; } } data structures: <pre lang="cs">public enum WABAPI { MAX_STRING_SIZE = 1024, SHORT_STRING_SIZE = 256, MAX_BUFFER_SIZE = 10240 } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct AccessibleContextInfo { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.MAX_STRING_SIZE)] public string name; // the AccessibleName of the object [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.MAX_STRING_SIZE)] public string description; // the AccessibleDescription of the object [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)] public string role; // localized AccesibleRole string [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)] public string role_en_US; // AccesibleRole string in the en_US locale [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)] public string states; // localized AccesibleStateSet string (comma separated) [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)] public string states_en_US; // AccesibleStateSet string in the en_US locale (comma separated) public Int32 indexInParent; // index of object in parent public Int32 childrenCount; // # of children, if any public Int32 x; // screen coords in pixels public Int32 y; // " public Int32 width; // pixel width of object public Int32 height; // pixel height of object public Boolean accessibleComponent; // flags for various additional public Boolean accessibleAction; // Java Accessibility interfaces public Boolean accessibleSelection; // FALSE if this object doesn't public Boolean accessibleText; // implement the additional interface // in question // BOOL accessibleValue; // old BOOL indicating whether AccessibleValue is supported public Boolean accessibleInterfaces; // new bitfield containing additional interface flags } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct AccessibleTextInfo { public Int32 charCount; // # of characters in this text object public Int32 caretIndex; // index of caret public Int32 indexAtPoint; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct AccessibleTextItemsInfo { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1)] public String letter; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)] public String word; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.MAX_STRING_SIZE)] public String sentence; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct AccessibleTextAttributesInfo { public Boolean bold; public Boolean italic; public Boolean underline; public Boolean strikethrough; public Boolean superscript; public Boolean subscript; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)] public String backgroundColor; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)] public String foregroundColor; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)] public String fontFamily; public Int32 fontSize; public Int32 alignment; public Int32 bidiLevel; public Single firstLineIndent; public Single leftIndent; public Single rightIndent; public Single lineSpacing; public Single spaceAbove; public Single spaceBelow; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.MAX_STRING_SIZE)] public String fullAttributesString; } Prototype import: [return: MarshalAs(UnmanagedType.Bool)] [DllImport("WindowsAccessBridge-64.dll", CallingConvention = CallingConvention.Cdecl, ThrowOnUnmappableChar = true, CharSet = CharSet.Unicode)] public extern static bool setTextContents(Int32 vmID, AccessibleContext accessibleContext, string text);
解決策 1
<pre lang="c#"> [return: MarshalAs(UnmanagedType.Bool)] [DllImport("WindowsAccessBridge-64.dll", CallingConvention = CallingConvention.Cdecl, ThrowOnUnmappableChar = true, CharSet = CharSet.Unicode)] public extern static bool setTextContents(Int32 vmID, AccessibleContext accessibleContext, string text); </pre> Should be: <pre lang="c#"> [return: MarshalAs(UnmanagedType.Bool)] [DllImport("WindowsAccessBridge-64.dll", CallingConvention = CallingConvention.Cdecl, ThrowOnUnmappableChar = true, CharSet = CharSet.Unicode)] public extern static bool setTextContents(Int32 vmID, <b>IntPtr accessibleContext</b>, string text);</pre>
解決策 2
C# を介して Java Access Bridge を使用して Oracle フォーム Java アプレットを自動化しようとしています。 テキスト フィールドから値を取得してボタンをクリックすることはできますが、setTextContents は機能しません。 これは、Oracle フォーム Java アプレットに対してのみ、常に誤った応答を返します。
アイデア/代替解決策はありますか? OracleフォームJavaアプレットでテキストを設定することを妨げているものを理解するのを手伝ってください。
私のコードスニペット:
if (!JabApi.setTextContents(vmID, txt.acPtr, “テストデータ”))
{
throw new Exception(“Error setting text”);
}
[ad_2]
コメント