Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 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);
 }
Ejemplo n.º 3
0
 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);
 }
Ejemplo n.º 4
0
        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);
        }