Comment récupérer un élément virtualisé
Cette rubrique contient un exemple de code qui montre comment rechercher et récupérer des informations sur l’interface utilisateur sur les éléments virtualisés dans un contrôle.
L’exemple suivant recherche un élément portant le nom spécifié dans un conteneur et récupère l’interface IUIAutomationElement pour l’élément. L’exemple recherche d’abord dans la sous-arborescence UI Automation. Si l’élément n’est pas présent, l’exemple utilise l’interface IUIAutomationItemContainerPattern de conteneur pour Rechercher l’élément, puis utilise l’interface IUIAutomationVirtualizedItemPattern de l’élément pour réaliser l’élément.
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;
}