很抱歉提出另一个递归问题,但我在这里看了很多,但没有找到解决我问题的方法。
我使用以下功能:
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 (WABAPI.getAccessibleContextInfo(vmID, ac, acPtr))
{
acInfo = (AccessibleContextInfo)Marshal.PtrToStructure(acPtr, typeof(AccessibleContextInfo));
if (!ReferenceEquals(acInfo, null))
{
AccessibleTextItemsInfo atInfo = new AccessibleTextItemsInfo();
if (acInfo.accessibleText)
{
IntPtr ati = Marshal.AllocHGlobal(Marshal.SizeOf(new AccessibleTextItemsInfo()));
WABAPI.getAccessibleTextItems(vmID, ac, ati, 0); //THIS IS WHERE WE DO IT
atInfo = (AccessibleTextItemsInfo)Marshal.PtrToStructure(ati, typeof(AccessibleTextItemsInfo));
if (ati != IntPtr.Zero)
{
Marshal.FreeHGlobal(ati);
}
}
AccessibleTreeItem newItem = BuildAccessibleTree(acInfo, atInfo, parentItem, acPtr);
newItem.setAccessibleText(atInfo);
if (!ReferenceEquals(newItem, null))
{
for (int i = 0; i < acInfo.childrenCount; i++)
{
//Used roles = text, page tab, push button
if (acInfo.role_en_US != "unknown" && acInfo.states_en_US.Contains("visible")) // Note the optomization here, I found this get me to an acceptable speed
{
AccessibleContextInfo childAc = new AccessibleContextInfo();
IntPtr childContext = WABAPI.getAccessibleChildFromContext(vmID, ac, i);
GetAccessibleContextInfo(vmID, childContext, out childAc, newItem);
if (childContext != IntPtr.Zero)
{
Settings.Save.debugLog("Releasing object " + childContext.ToString() + " from JVM: " + vmID);
WABAPI.releaseJavaObject(vmID, childContext);
childContext = IntPtr.Zero;
}
}
}
}
return newItem;
}
}
else
{
acInfo = new AccessibleContextInfo();
}
}
finally
{
if (acPtr != IntPtr.Zero)
Marshal.FreeHGlobal(acPtr);
}
}
return null;
}
构建表示Java应用程序的整个GUI的AccessibleTreeItem。但是,此功能需要5-6秒才能运行。我只是在寻找树的一个特定部分(让我们称之为Porkchops)。
我想要做的是在构建树之前获取值,并且只要acRole.name ==“Porkchop”,将其用作父对象并创建表示子树的AccessibleTreeItem。
我该怎样管理这个?如果这是一个简单的问题,请道歉,但它让我发疯。
编辑1 - 在releaseJavaObject()上遇到性能损失,因为当我删除该行时,该函数在不到一秒的时间内完成,但它会造成可怕的内存泄漏。
因此,我并不是在寻找替代解决方案,因为我知道上述方法可以正常工作。我只需要一些方法在创建树之前检查acInfo.name的值,然后使用正确的acInfo节点作为父节点。
编辑2 - 请参阅附图,以获得比漫无边际更好的解释。目前,该函数将从JVM中提取整个树。我已经突出显示了我使用的相应部分,并且想知道是否有一种方法可以让我获取该信息,而无需构建整个树。或者,即使我已经填充了该节点的所有子节点,我也可以返回树。