Como recuperar um item virtualizado
Este tópico contém código de exemplo que mostra como localizar e recuperar informações da interface do usuário sobre itens virtualizados em um controle.
O exemplo a seguir pesquisa um contêiner em busca de um item que tenha o nome especificado e recupera a interface IUIAutomationElement para o item. O exemplo examina primeiro a subárvore Automação da Interface do Usuário. Se o item não estiver lá, o exemplo usará a interface IUIAutomationItemContainerPattern do contêiner para localizar o item e usará a interface IUIAutomationVirtualizedItemPattern do item para realizar o item.
HRESULT GetContainerItem (BSTR bstrItemName, IUIAutomationElement *pContainerElement,
IUIAutomationElement **ppItemElement)
{
HRESULT hr;
VARIANT varNameStr;
IUIAutomationCondition *pNamePropertyCond = NULL;
IUIAutomationElement *pFoundElement = NULL;
IUIAutomationItemContainerPattern *pItemContainer = NULL;
// Make sure the pointers are valid.
if (ppItemElement == NULL || pContainerElement == NULL || bstrItemName == NULL)
return E_INVALIDARG;
*ppItemElement = NULL;
// Try to find the item in the UI Automation tree. This attempt will fail if the
// item is virtualized. Note: g_pAutomation is a global pointer to the IUIAutomation interface.
varNameStr.vt = VT_BSTR;
varNameStr.bstrVal = SysAllocString(bstrItemName);
hr = g_pAutomation->CreatePropertyCondition(UIA_NamePropertyId, varNameStr, &pNamePropertyCond);
if (pNamePropertyCond == NULL)
goto cleanup;
hr = pContainerElement->FindFirst(TreeScope_Subtree, pNamePropertyCond, &pFoundElement);
if (pFoundElement == NULL) {
// The item is not in the UI Automation tree, so it may be virtualized. Try
// using the ItemContainer control pattern to find the item.
hr = pContainerElement->GetCurrentPatternAs(UIA_ItemContainerPatternId,
__uuidof(IUIAutomationItemContainerPattern),
(void**)&pItemContainer);
if (pItemContainer == NULL)
goto cleanup;
hr = pItemContainer->FindItemByProperty(NULL, UIA_NamePropertyId, varNameStr, &pFoundElement);
if (pFoundElement == NULL) // container has no item with the specified name
goto cleanup;
}
// Attempt to get the name property. The attempt will fail with
// UIA_E_ELEMENTNOTAVAILABLE if the item is virtualized.
BSTR bstrName;
hr = pFoundElement->get_CurrentName(&bstrName);
if (hr == UIA_E_ELEMENTNOTAVAILABLE)
{
// The item might be virtualized. Use the VirtualizedItem control pattern to
// realize the item.
IUIAutomationVirtualizedItemPattern *pVirtualizedItem;
hr = pFoundElement->GetCurrentPatternAs(UIA_VirtualizedItemPatternId,
__uuidof(IUIAutomationVirtualizedItemPattern), (void**)&pVirtualizedItem);
if (pVirtualizedItem == NULL)
goto cleanup;
hr = pVirtualizedItem->Realize();
pVirtualizedItem->Release();
if (hr != S_OK)
goto cleanup;
// Try to get the name again.
hr = pFoundElement->get_CurrentName(&bstrName);
}
if (SUCCEEDED(hr))
{
// Make sure the item is the one we're looking for.
if (wcscmp(bstrName, bstrItemName) == 0)
{
*ppItemElement = pFoundElement;
pFoundElement = NULL;
}
}
cleanup:
VariantClear(&varNameStr);
if (pNamePropertyCond != NULL) pNamePropertyCond->Release();
if (pFoundElement != NULL) pFoundElement->Release();
if (pItemContainer != NULL) pItemContainer->Release();
return hr;
}
Tópicos relacionados