public static AccessibleTreeItem GetComponentTree(IntPtr hWnd, out Int32 vmID) { screenContents.Clear(); screenContentsString = string.Empty; AccessibleTreeItem accessibleTreeItem = new AccessibleTreeItem(); vmID = 0; if (JabApi.isJavaWindow(hWnd) == 1) { unsafe { IntPtr acPtr; if (JabApi.getAccessibleContextFromHWND(hWnd, out vmID, out acPtr)) { AccessibleContextInfo ac = new AccessibleContextInfo(); accessibleTreeItem = GetAccessibleContextInfo(vmID, acPtr, out ac, null, 0, string.Empty); // RECURSION SEED return(accessibleTreeItem); } } } return(null); }
private static AccessibleTreeItem BuildAccessibleTree(AccessibleContextInfo acInfo, AccessibleTreeItem parentItem) { if (!ReferenceEquals(acInfo, null)) { AccessibleTreeItem item = new AccessibleTreeItem(acInfo); if (!ReferenceEquals(parentItem, null)) { screenContents.Add(item); parentItem.children.Add(item); } return(item); } return(null); }
public static AccessibleTreeItem Find(AccessibleTreeItem node, string name) { if (node == null) { return(null); } if (node.name == name) { return(node); } foreach (var child in node.children) { var found = Find(child, name); if (found != null) { return(found); } } return(null); }
private static AccessibleTreeItem GetAccessibleContextInfo(Int32 vmID, IntPtr currentPtr, out AccessibleContextInfo currentContext, AccessibleTreeItem parentItem, int level, string lineage) { unsafe { // Allocate global memory space for the size of AccessibleContextInfo and store the address in acPtr IntPtr acPtr = Marshal.AllocHGlobal(Marshal.SizeOf(new AccessibleContextInfo())); try { Marshal.StructureToPtr(new AccessibleContextInfo(), acPtr, true); if (JabApi.getAccessibleContextInfo(vmID, currentPtr, acPtr)) { currentContext = (AccessibleContextInfo)Marshal.PtrToStructure(acPtr, typeof(AccessibleContextInfo)); if (!ReferenceEquals(currentContext, null)) { AccessibleTreeItem newItem = BuildAccessibleTree(currentContext, parentItem); if (!ReferenceEquals(newItem, null)) { //Checks to see if current object has any text items. if (currentContext.accessibleText == true) { AccessibleTextItemsInfo textItem; //Gets text items. textItem = GetAccessibleTextInfo(vmID, currentPtr); newItem.textValue = textItem.sentence; string treeInfo = Repeat("\t", level) + currentContext.name + " = \"" + textItem.sentence + "\""; screenContentsString += treeInfo + Environment.NewLine; Debug.Print(treeInfo); } else { string treeInfo = Repeat("\t", level) + currentContext.name; screenContentsString += treeInfo + Environment.NewLine; Debug.Print(treeInfo); } //Start collecting children int nextLevel = level + 1; for (int i = 0; i < currentContext.childrenCount; i++) { string lineageInfo = Repeat("\t", level) + level.ToString() + " Child " + i.ToString() + " Lineage = {" + lineage + "}"; screenContentsString += lineageInfo + Environment.NewLine; Debug.Print(lineageInfo); string currentlineage; if (lineage == string.Empty) { currentlineage = i.ToString(); } else { currentlineage = lineage + ", " + i.ToString(); } if (currentContext.role_en_US != "unknown" && currentContext.states_en_US.Contains("visible")) // Note the optomization here, I found this get me to an acceptable speed { AccessibleContextInfo childContext = new AccessibleContextInfo(); IntPtr childPtr = JabApi.getAccessibleChildFromContext(vmID, currentPtr, i); GetAccessibleContextInfo(vmID, childPtr, out childContext, newItem, nextLevel, currentlineage); //TODO: Not sure when or where to release the java objects, the JVM will leak memory until released //JabApi.releaseJavaObject(vmID, childPtr); } } } return(newItem); } } else { currentContext = new AccessibleContextInfo(); } } finally { if (acPtr != IntPtr.Zero) { Marshal.FreeHGlobal(acPtr); } //TODO: Not sure when or where to release the java objects, the JVM will leak memory until released //JabApi.releaseJavaObject(vmID, currentPtr); } } return(null); }