#c #windows #winapi #ui-automation #microsoft-ui-automation
#c #Windows #winapi #автоматизация пользовательского интерфейса #microsoft-ui-automation
Вопрос:
Я пытаюсь специально перечислить все дочерние окна «имена»: включить текущее отключение (кнопка)
Вот мой код для перечисления всех дочерних окон:
void ListDescendants(IUIAutomationElement* pParent, int indent)
{
if (pParent == NULL)
return;
IUIAutomationTreeWalker* pControlWalker = NULL;
IUIAutomationElement* pNode = NULL;
g_pAutomation->get_ControlViewWalker(amp;pControlWalker);
if (pControlWalker == NULL)
goto cleanup;
pControlWalker->GetFirstChildElement(pParent, amp;pNode);
if (pNode == NULL)
goto cleanup;
while (pNode)
{
BSTR desc;
pNode->get_CurrentName(amp;desc);
for (int x = 0; x <= indent; x )
{
std::wcout << L" ";
}
std::wcout << desc << L"n";
SysFreeString(desc);
ListDescendants(pNode, indent 1);
IUIAutomationElement* pNext;
pControlWalker->GetNextSiblingElement(pNode, amp;pNext);
pNode->Release();
pNode = pNext;
}
cleanup:
if (pControlWalker != NULL)
pControlWalker->Release();
if (pNode != NULL)
pNode->Release();
return;
}
НО ВЫВОД:
ContentLeftPanel
VideoContainerWnd
Video Content
Я просто хочу имя / заголовок этой кнопки отключения / отключения звука.. для этого мне нужен список всех дочерних окон…
Комментарии:
1. Не могу протестировать, потому что у меня нет этого приложения, но вы можете использовать IUIAutomationElement::FindAll с надлежащим условием. docs.microsoft.com/en-us/windows/win32/api/uiautomationclient/… Inspect сам использует UIA, поэтому может найти их, если сможет. Однако обратите внимание, что при использовании inspect вы можете находиться в контексте, где дерево отличается от того, когда вы запускаете свой код. Дерево пользовательского интерфейса — это живое существо, в конечном счете зависящее от того, что делает конечный пользователь.
2. Да, вы правы, у меня возникла эта проблема, потому что дерево — это ЖИВОЕ СУЩЕСТВО. Мне нужно было навести курсор на window, прежде чем перечислять все элементы.