如何擷取虛擬化專案
本主題包含範例程式碼,示範如何尋找及擷取控制項中虛擬化專案的 UI 資訊。
下列範例會在容器中搜尋具有指定名稱的專案,並擷取專案的 IUIAutomationElement 介面。 此範例會先查看消費者介面自動化子樹。 如果專案不存在,此範例會使用容器 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;
}
相關主題