C автоматизация пользовательского интерфейса Windows: не удается перечислить все дочерние окна

#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, прежде чем перечислять все элементы.