가상화된 항목을 검색하는 방법
이 항목에는 컨트롤에서 가상화된 항목에 대한 UI 정보를 찾고 검색하는 방법을 보여 주는 예제 코드가 포함되어 있습니다.
다음 예제에서는 컨테이너에서 지정된 이름의 항목을 검색하고 항목에 대한 IUIAutomationElement 인터페이스를 검색합니다. 이 예제는 먼저 UI 자동화 하위 트리를 찾습니다. 항목이 없는 경우 이 예제에서는 컨테이너 IUIAutomationItemContainerPattern 인터페이스를 사용하여 항목을 찾은 다음, 항목 IUIAutomationVirtualizedItemPattern 인터페이스를 사용하여 항목을 실현합니다.
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;
}
관련 항목