實作 Client-Side (Proxy) 消費者介面自動化 提供者
Microsoft 消費者介面自動化為大部分的標準控制項提供一組 Proxy,例如 Microsoft Win32、Windows Forms 和 Windows Presentation Foundation (WPF) 應用程式中使用的 Proxy。 不過,許多自訂控制項和協力廠商控制項不會實作原生消費者介面自動化提供者。 若要可供消費者介面自動化用戶端應用程式存取,這些控制項必須與用戶端提供者一起提供,也稱為Proxy 提供者或Proxy。
本主題描述如何撰寫不支援控制項的 Proxy 提供者,並將它新增至用戶端應用程式所使用的 Proxy 清單。 它包含下列主題︰
如需示範如何實作 Proxy 提供者的程式碼範例,請參閱消費者介面自動化 提供者的操作說明主題。
什麼是 Proxy?
用戶端提供者或 Proxy 是物件,代表沒有自己的 IRawElementProviderSimple 實作 IRawElementProviderSimple 實作的控制項。 如果沒有 Proxy,這類控制項主要是不透明的消費者介面自動化,這只能提供從視窗控制碼 (HWND) 取得的基本資訊,例如控制項位置。
什麼是 Proxy Factory?
每個 Proxy 都需要對應的 Proxy Factory,這是公開 IUIAutomationProxyFactory 介面的物件。 消費者介面自動化會維護Proxy 處理站專案的內部資料表,每個專案都包含每個 Proxy 處理站的 Proxy 處理站參考,以及一組條件。 當消費者介面自動化遇到沒有原生IRawElementProviderSimple實作的控制項時,它會搜尋 Proxy 處理站專案,其條件表示它支援控制項。 消費者介面自動化從頭搜尋資料表,並在找到相符的專案時,消費者介面自動化呼叫 Factory 的IUIAutomationProxyFactory::CreateProvider方法。 如果成功建立相符的 Proxy,消費者介面自動化會停止搜尋並使用新建立的 Proxy 物件,否則消費者介面自動化繼續搜尋。
用戶端應用程式會使用 IUIAutomation::CreateProxyFactoryEntry 方法建立 Proxy Factory 專案的實例,此方法會傳回 IUIAutomationProxyFactoryEntry 介面指標。 用戶端會使用 IUIAutomationProxyFactoryEntry 公開的方法,指定 Proxy 處理站用來建立 Proxy 的條件集。
呼叫IUIAutomationProxyFactory::CreateProvider時,消費者介面自動化傳遞 Proxy Factory 物件可用來判斷 Proxy 是否充分支援自訂控制項的參數。 如果是,Proxy Factory 會建立 Proxy 的實例,並傳回 IRawElementProviderSimple 介面指標;否則會傳回 Null 指標。
Proxy 處理站對應
根據預設,消費者介面自動化依照下列順序搜尋 Proxy Factory 資料表。
單 | Proxy | 描述 |
---|---|---|
1 | Microsoft:非控制 Proxy | 對於具有確切類別名稱或基類名稱 「ComboBoxEx32」 的 Windows。 |
2 | Microsoft:非控制 Proxy | 對於具有確切類別名稱或基類名稱 「WorkerW」 的視窗。 |
3 | Microsoft:非控制 Proxy | 對於具有確切類別名稱或基類名稱 「SHELLDLL_DefView」 的視窗。 |
4 | Microsoft:容器 Proxy | 對於具有確切類別名稱或基類名稱 「#32770」 的 Windows。 |
5 | Microsoft:容器 Proxy | 對於類別名稱或基類名稱包含 「AfxControlBar」 的視窗。 |
6 | Microsoft:TreeView Proxy | 對於類別名稱或基類名稱包含 「SysTreeView32」 的 Windows。 |
7 | Microsoft:ListView Proxy | 對於類別名稱或基類名稱包含 「SysListView32」 的 windows, (1) 。 |
8 | Microsoft:ListView Proxy | 對於類別名稱或基類名稱包含 「SysListView32」 的 windows, (2) 。 |
9 | Microsoft:MSAA Proxy | 針對任何視窗。 |
Proxy 7 和 8 是 SysListView32 控制項的重複專案。 若未修改,Proxy 7 一律會用於 SysListView32 控制項,而且永遠不會使用 Proxy 8。 Proxy 8 僅用於可見的清單專案,而且通常供僅使用可見元素或具有嚴格效能需求的用戶端應用程式使用。 這些用戶端可以移除 Proxy 7。
Proxy 9 是消費者介面自動化 Proxy 的 Microsoft Active Accessibility,應該一律是資料表中的最後一個專案。 這可讓實作 Microsoft Active Accessibility 但不會消費者介面自動化的控制項啟用 Microsoft Active Accessibility 後援功能。
修改 Proxy Factory 資料表中的專案時,您應該仔細評估專案的新位置。 我們建議將自訂 Proxy 的專案放在非控制項和容器 Proxy 之後,但在 Microsoft Active Accessibility 消費者介面自動化 Proxy 之前。 此外,雖然您可以讓CreateProvider呼叫中的程式碼判斷它是否應該支援指定的視窗控制碼 (HWND) ,但最好讓消費者介面自動化根據類別名稱選取 Proxy,並將條件式程式碼保留在CreateProvider方法中,以最小值保留條件式程式碼。
消費者介面自動化會為每個用戶端維護個別的 Proxy Factory 資料表。 當用戶端變更其 Proxy 資料表時,變更只會影響用戶端本身;其他用戶端不會受到影響。
管理預設 Proxy
當用戶端應用程式建立 CUIAutomation 物件時,Proxy Factory 資料表一開始只會針對標準控制項的預設 Proxy 提供者包含專案。 藉由使用 IUIAutomationProxyFactoryMapping 介面,用戶端可以新增專案、移除不必要的專案、變更專案的順序等等。 用戶端可以藉由呼叫IUIAutomation::P roxyFactoryMapping方法來擷取IUIAutomationProxyFactoryMapping介面指標。
可用的 Proxy 資料表包含每個 Proxy 的 IUIAutomationProxyFactoryEntry 介面。 每個 IUIAutomationProxyFactoryEntry 都會指定 IUIAutomationProxyFactory 和 Proxy 服務的控制項類別,並定義如何處理事件。
Proxy 的資料表是由 IUIAutomationProxyFactoryMapping 介面表示,可從 IUIAutomation::P roxyFactoryMapping 屬性取得。 應用程式可以使用 IUIAutomationProxyFactoryMapping 方法來新增和刪除 Proxy。 若要建立要新增至此資料表的新專案,請使用 IUIAutomation::CreateProxyFactoryEntry 來取得介面,然後使用 IUIAutomationProxyFactoryEntry 方法來定義適用的控制項類別和 Proxy 的行為。
相關主題