如何在專案檢視中查詢虛擬化專案
本主題描述如何使用 Microsoft 消費者介面自動化來擷取 Windows 7 專案檢視中虛擬化專案的 UI 資訊。 本主題包含下列各節。
注意
本主題僅適用于 Windows 7。 請注意,本主題所述的協助工具功能可能會在未來的 Windows 版本中變更。
概觀
專案檢視是使用者介面元件,可讓使用者檢視及與檔案和其他專案互動。 在 Windows 7 中,專案檢視會取代清單檢視控制項,以便在 Windows 檔案總管的預設檢視中呈現專案。 [一般專案] 對話方塊、[開始] 功能表搜尋結果,以及使用 [總管瀏覽器] 控制項的其他 Windows 7 UI 元素也會使用專案檢視。 相較于清單檢視控制項,[專案檢視] 為使用者提供下列優點:
- 專案檢視可以更實用、想要且相關的方式呈現專案,讓使用者能夠更簡單、快速且輕鬆地尋找及組織專案。
- 專案檢視可以從具有不同效能特性的資料來源顯示大量的專案集,讓使用者能夠跨多個來源流覽和搜尋其整個專案集合。
下圖顯示 Windows 檔案總管中的 [專案檢視]。
從開發人員的觀點來看,專案檢視的一般結構和功能類似于清單檢視控制項的結構和功能。 主要差異在於專案檢視支援虛擬化,而清單檢視控制項則不支援。 此外,專案檢視會使用兩個新的消費者介面自動化介面,以確保專案檢視所提供的虛擬化內容可供存取。 本主題的下列各節將說明這些介面。
如需消費者介面自動化虛擬化的一般資訊,請參閱使用虛擬化專案。
專案檢視樹狀結構
在消費者介面自動化樹狀結構中,專案檢視的最上層消費者介面自動化元素名稱為 「ItemsView」 和控制項類型 「list」。 在上圖中,ItemsView 消費者介面自動化 元素會以紅色大綱顯示。 專案檢視的最上層有各種消費者介面自動化元素存在,但本檔中只會參考其他兩個消費者介面自動化元素:群組專案和清單專案。
群組專案是包含該群組所有清單專案的消費者介面自動化元素,其控制項類型為「群組」,其名稱會視組名而有所不同。 在上圖中,第一個群組專案同時包含 「A-H (1) 」 標頭和 「Folder」 清單專案,其名稱為 「A-H」。
清單專案是代表檢視中分葉專案的消費者介面自動化元素,其控制項類型為 「ListItem」,其名稱會根據專案名稱而有所不同。 在上圖中,清單元素是分葉元素,例如 「Folder」、「Music」 和 「Picture」。 這三個消費者介面自動化元素是由本文其餘部分的 ItemsView 元素、Group 元素和 ListItem 元素一詞所參考。
虛擬化
專案檢視會使用虛擬化,這表示檢視可見區域以外的專案不會從系統擷取,而且不會建立它們的 UI 標記法。 這些專案稱為 虛擬化專案。 因為未建立這些專案,所以虛擬化專案沒有消費者介面自動化元素,因此當消費者介面自動化用戶端列舉樹狀結構時,不會出現在消費者介面自動化樹狀結構中。 此外,消費者介面自動化控制項模式只能在可見元素上運作。 例如,當用戶端呼叫IUIAutomationSelectionPattern::GetCurrentSelection方法時,選取控制項模式只會傳回可見的選取專案。
專案檢視支援擷取有關虛擬化專案的下列資訊:
- 專案總數的計數,包括虛擬化專案
- 虛擬化專案的消費者介面自動化元素
- 為選取的虛擬化專案消費者介面自動化專案
取得所有專案的計數
用戶端可以使用 ItemsView 元素來取得所有專案的計數,以及所選項目的計數。 ItemsView 元素提供兩種方式來取得這些計數。 第一個是取得 ItemsView 元素的 ItemStatus 屬性,而第二個則是從 ItemsView 元素取得自訂屬性。
ItemStatus 屬性是一個字串,指定專案總數的計數和選取專案的計數,並以逗號分隔。 例如:「3 個專案,選取 1 個專案」。 此字串已當地語系化,而且可以直接與使用者通訊。
ItemsView 元素的自訂屬性包含專案計數的一個屬性,另一個用於選取計數。 包括:
ItemCount_Property_GUID (ABBF5C45-5CCC-47b7-BB4E-87CB87BBD162) — 檢視中所有唯一專案的計數。 如果以多重值屬性分組, (MVP) 讓單一專案出現多次,則每個專案只會計算一次。
(UIAutomationType: UIAutomationType_Int, 程式設計名稱: 「ItemCount」)
SelectedItemCount_Property_GUID (92A053DA-2969-4021-BF27-514CFC2E4A69) — 檢視中選取的所有唯一專案計數。 如果以多重值屬性分組, (MVP) 讓單一專案出現多次,則每個專案只會計算一次。
(UIAutomationType: UIAutomationType_Int,程式設計名稱:「SelectedItemCount」)
這些自訂屬性定義于 Shlguid.h 中,包含在 Windows 軟體發展工具組 (SDK) 中,這些屬性會透過 IUIAutomationRegistrar::RegisterProperty 方法註冊。 消費者介面自動化用戶端會使用RegisterProperty擷取自訂屬性的屬性識別碼) (PROPERTYID。
取得所有專案的專案索引
用戶端可以取得 ListItem 元素的 ItemStatus 屬性,或取得 ListItem 元素的自訂屬性,以取得專案的索引。
ItemStatus 屬性是字串,其中包含專案總數的索引。 例如:「item 1 of 3」。 此字串已當地語系化,而且可以直接與使用者通訊。
下列自訂屬性會取得 ListItem 元素的專案索引:
ItemIndex_Property_GUID (92A053DA-2969-4021-BF27-514CFC2E4A69) — 專案的 1 型絕對索引。 如果以多重值屬性分組, (MVP) 讓單一專案可以出現兩次,則專案的每個外觀都會取得個別的索引。
(UIAutomationType: UIAutomationType_Int, 程式設計名稱: 「ItemIndex」)
此自訂屬性定義于 Windows SDK 中包含的 Shlguid.h 中,並透過 IUIAutomationRegistrar::RegisterProperty 方法註冊 。 消費者介面自動化用戶端會使用RegisterProperty來擷取自訂屬性的屬性識別碼 (PROPERTYIDs) 。
取得 Vitualized 專案的參考
ItemsView 元素會實作ItemContainer控制項模式 (IItemContainerProvider介面) ,讓用戶端取得虛擬化專案的消費者介面自動化元素, (位於可見區域以外的專案) 。 ItemsView 可讓用戶端藉由搜尋 Name 和 Selection 屬性來尋找 ListItem 元素,嘗試搜尋任何其他屬性將會失敗。
虛擬元素只會實作 VirtualizedItem 控制項模式, (IVirtualizedItemProvider 介面) 。 由於虛擬化消費者介面自動化專案所代表的專案尚不存在,因此嘗試取得專案的任何其他控制項模式或屬性將會失敗。
ListItem 和 Group 元素都是虛擬化的,但只能從 ItemContainer 控制項模式傳回 ListItem 元素。 由於 對 IUIAutomationItemContainerPattern::FindItemByProperty 方法的呼叫會在 UI 執行緒上執行並封鎖,因此在 FindItemByProperty 傳回之前,檢視將不會回應,而且提供者上的任何其他方法呼叫必須等到 FindItemByProperty 完成為止。 在某些情況下, FindItemByProperty 必須先處理整個資料集,才能傳回,這可能需要大量資源。 將 Null 指定為起始元素會導致 FindItemByProperty 開始搜尋檢視中的第一個專案。
ItemsView 支援 FindItemByProperty的下列屬性:
- 名稱 (UIA_NamePropertyId) — 搜尋名稱完全符合指定字串的第一個專案。 搜尋是不區分大小寫的。 不支援萬用字元或部分比對。 如果指定 Null 名稱,則會傳回起始專案之後的下一個專案。 指定Null名稱可讓消費者介面自動化用戶端列舉檢視中的所有專案;不過,不建議列舉所有專案,因為它會導致檢視中的所有專案實現。
- SelectionItem_IsSelected (UIA_SelectionItemIsSelectedPropertyId) - 搜尋SelectionItem_IsSelected屬性符合指定值的第一個專案。 指定 TRUE 以尋找第一個選取的專案,或 指定 FALSE 來尋找第一個未選取的專案。 列舉所有選取的專案時請小心,因為選取的專案數目可能非常大,特別是當使用者已選取所有專案時。
在畫面上捲動虛擬化專案
取得虛擬化 (螢幕外) 專案的消費者介面自動化元素參考之後,用戶端可以使用VirtualizedItem控制項模式的IUIAutomationVirtualizeItemPattern::Realize方法,將專案捲動至檢視。 在專案實現之後,即可看見它,而且通常與 ListItem 元素相關聯的所有屬性和控制項模式都可供用戶端使用。
只有 IUIAutomationItemContainerPattern::FindItemByProperty 方法取得的 ListItem 元素會公開 VirtualizedItem 控制項模式。 當螢幕專案在螢幕外捲動時,元素會變成無效,而且用戶端必須呼叫 FindItemByProperty 以取得螢幕外參考。
您也可以使用 捲動 控制項模式 (或使用捲軸) ,將專案移入和移出檢視。 專案和群組會在捲動至檢視時實現,並在從檢視捲動時虛擬化。
相關主題