Извините, что поднял еще один вопрос о рекурсии, но я просмотрел некоторые из них здесь и не нашел решения для моей проблемы.
Я использую следующую функцию:
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;
}
Для создания AccessibleTreeItem, представляющего весь графический интерфейс приложения Java.Однако для запуска этой функции требуется 5-6 секунд.Я ищу только один конкретный подраздел дерева (давайте назовем его Porkchops).
Что я хотел бы сделать, это до построения дерева, получения значений и, как только acRole.name == "Porkchop", использовать его в качестве родительского объекта и создать AccessibleTreeItem, который представляет поддерево.
Как, черт возьми, мне это удается?Если это простой вопрос, прошу прощения, но это сводит меня с ума.
Edit 1 - Падение производительности встречается в releaseJavaObject (), как при удалении этой строки, функция завершается вменьше секунды, но это приводит к ужасной утечке памяти.
Поэтому я не особо ищу альтернативные решения, так как знаю, что вышесказанное работает правильно.Мне просто нужен какой-то способ проверить значение acInfo.name до создания дерева, а затем использовать правильный узел acInfo в качестве родительского.
Редактировать 2 - см. Прилагаемое изображение длялучшее объяснение, чем мой бессвязный.В настоящее время функция будет извлекать все это дерево из JVM.Я выделил соответствующий раздел, с которым я работаю, и хотел бы знать, если есть способ, который позволит мне получить эту информацию, не создавая всего дерева.Или даже если бы я мог просто вернуть дерево, как только все дочерние узлы этого узла будут заполнены.
