We are using the Java Access Bridge (windows access bridge DLL) in trying to send text to a java window’s fields. We have initialized the A.P.I., successfully detected a java window (this only works correctly on the second call to the “isJavaWindow” function). We are able to obtain the accessible context via “getAccessibleContextFromHWND”. We then use the context to recurse through the children until we find the text box in question. We are able to use “getTextInfo” function to read the contents of the field and the “getAccessibleContextInfo” function is returning good data. I can see that the property of the field is editable via the accessibleContextInfo data structure, however the “setTextContents” function always returns false. Here is the code snippet usage in C# (we have also tried using Autoit) A.P.I. version 2.0.2
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
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;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.MAX_STRING_SIZE)]
public string description;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)]
public string role;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)]
public string role_en_US;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)]
public string states;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)WABAPI.SHORT_STRING_SIZE)]
public string states_en_US;
public Int32 indexInParent;
public Int32 childrenCount;
public Int32 x;
public Int32 y;
public Int32 width;
public Int32 height;
public Boolean accessibleComponent;
public Boolean accessibleAction;
public Boolean accessibleSelection;
public Boolean accessibleText;
public Boolean accessibleInterfaces;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct AccessibleTextInfo
{
public Int32 charCount;
public Int32 caretIndex;
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);