Sdílet prostřednictvím


Implementace zprostředkovatele automatizace uživatelského rozhraní na straně serveru

Poznámka:

Tato dokumentace je určená pro vývojáře rozhraní .NET Framework, kteří chtějí používat spravované třídy model UI Automation definované v System.Windows.Automation oboru názvů. Nejnovější informace o model UI Automation najdete v tématu Rozhraní API služby Windows Automation: model UI Automation.

Tato část popisuje, jak implementovat poskytovatele model UI Automation na straně serveru pro vlastní ovládací prvek.

Implementace prvků WPF (Windows Presentation Foundation) a prvků jiných než WPF (jako jsou ty určené pro model Windows Forms) se zásadně liší. Prvky WPF poskytují podporu pro model UI Automation prostřednictvím třídy odvozené z AutomationPeer. Prvky bez WPF poskytují podporu prostřednictvím implementací rozhraní zprostředkovatele.

Aspekty zabezpečení

Poskytovatelé by měli být napsaní, aby mohli pracovat v prostředí s částečnou důvěryhodností. Vzhledem k tomu, že UIAutomationClient.dll není nakonfigurovaný tak, aby běžel pod částečným vztahem důvěryhodnosti, neměl by kód zprostředkovatele odkazovat na toto sestavení. Pokud ano, může se kód spustit v plně důvěryhodném prostředí, ale pak selže v prostředí s částečnou důvěryhodností.

Zejména nepoužívejte pole z tříd v UIAutomationClient.dll, jako jsou například pole v AutomationElement. Místo toho použijte ekvivalentní pole z tříd v UIAutomationTypes.dll, například AutomationElementIdentifiers.

Implementace zprostředkovatele podle elementů Windows Presentation Foundation

Další informace o tomto tématu najdete v tématu model UI Automation vlastního ovládacího prvku WPF.

Implementace zprostředkovatele pomocí elementů bez WPF

Vlastní ovládací prvky, které nejsou součástí architektury WPF, ale které jsou napsané ve spravovaném kódu (nejčastěji se jedná o ovládací prvky model Windows Forms), poskytují podporu model UI Automation implementací rozhraní. Každý prvek musí implementovat alespoň jedno z rozhraní uvedených v první tabulce v další části. Kromě toho, pokud prvek podporuje jeden nebo více řídicích vzorů, musí implementovat příslušné rozhraní pro každý vzor ovládacího prvku.

Projekt zprostředkovatele model UI Automation musí odkazovat na následující sestavení:

  • UIAutomationProviders.dll

  • UIAutomationTypes.dll

  • WindowsBase.dll

Rozhraní zprostředkovatele

Každý poskytovatel model UI Automation musí implementovat jedno z následujících rozhraní.

Rozhraní Popis
IRawElementProviderSimple Poskytuje funkce pro jednoduchý ovládací prvek hostovaný v okně, včetně podpory vzorů a vlastností ovládacích prvků.
IRawElementProviderFragment Dědí z IRawElementProviderSimple. Přidá funkce pro prvek v komplexním ovládacím prvku, včetně navigace v rámci fragmentu, nastavení fokusu a vrácení ohraničujícího obdélníku prvku.
IRawElementProviderFragmentRoot Dědí z IRawElementProviderFragment. Přidá funkce pro kořenový prvek v komplexním ovládacím prvku, včetně vyhledání podřízeného prvku na zadaných souřadnicích a nastavení stavu fokusu pro celý ovládací prvek.

Následující rozhraní poskytují přidané funkce, ale není nutné je implementovat.

Rozhraní Popis
IRawElementProviderAdviseEvents Umožňuje poskytovateli sledovat požadavky na události.
IRawElementProviderHwndOverride Umožňuje přemístit prvky založené na okně v rámci model UI Automation stromu fragmentu.

Všechna ostatní rozhraní v System.Windows.Automation.Provider oboru názvů jsou určená pro podporu vzorů ovládacích prvků.

Požadavky pro jiné poskytovatele než WPF

Aby bylo možné komunikovat s model UI Automation, musí váš ovládací prvek implementovat následující hlavní oblasti funkčnosti:

Funkce Implementace
Zveřejnění poskytovatele pro model UI Automation V reakci na WM_GETOBJECT zprávu poslanou do ovládacího okna vraťte objekt, který implementuje IRawElementProviderSimple (nebo odvozené rozhraní). V případě fragmentů to musí být zprostředkovatel kořene fragmentu.
Zadání hodnot vlastností Implementujte GetPropertyValue pro zadání nebo přepsání hodnot.
Povolení interakce s ovládacím prvku klientem Implementujte rozhraní, která podporují řídicí vzory, například IInvokeProvider. Vraťte tyto poskytovatele vzorů ve vaší implementaci GetPatternProvider.
Vyvolání událostí Volání jedné ze statických AutomationInteropProvider metod vyvolání události, kterou klient může naslouchat.
Povolení navigace a zaměření v rámci fragmentu Implementujte IRawElementProviderFragment pro každý prvek v rámci fragmentu. (Není nutné pro prvky, které nejsou součástí fragmentu.)
Povolení zaměření a umístění podřízeného prvku v fragmentu Implementovat IRawElementProviderFragmentRoot. (Není nutné pro prvky, které nejsou fragmenty kořenů.)

Hodnoty vlastností v jiných poskytovatelích než WPF

model UI Automation poskytovatelé vlastních ovládacích prvků musí podporovat určité vlastnosti, které můžou používat systém automatizace i klientské aplikace. U prvků hostovaných ve Windows (HWNDs) model UI Automation může načíst některé vlastnosti z výchozího poskytovatele okna, ale musí získat jiné od vlastního poskytovatele.

Poskytovatelé ovládacích prvků založených na HWND obvykle nemusí poskytovat následující vlastnosti (identifikované hodnotami polí):

Poznámka:

Z RuntimeIdProperty okna se získá jednoduchý element nebo kořen fragmentu hostovaného v okně. Prvky fragmentu pod kořenem (například položky seznamu v seznamu) ale musí obsahovat vlastní identifikátory. Další informace najdete na webu GetRuntimeId.

Hodnota IsKeyboardFocusableProperty by se měla vrátit pro poskytovatele hostované v ovládacím prvku model Windows Forms. V tomto případě nemusí být výchozí zprostředkovatel okna schopen načíst správnou hodnotu.

Poskytovatel NameProperty hostitele obvykle poskytuje. Pokud je například vlastní ovládací prvek odvozen z Control, název je odvozen z Text vlastnosti ovládacího prvku.

Například kód naleznete v části Vrácení vlastností zprostředkovatele model UI Automation.

Události v jiných poskytovatelích než WPF

model UI Automation poskytovatelé by měli vyvolat události, aby klientské aplikace informovaly o změnách ve stavu uživatelského rozhraní. K vyvolání událostí se používají následující metody.

metoda Popis
RaiseAutomationEvent Vyvolává různé události, včetně událostí aktivovaných vzory ovládacích prvků.
RaiseAutomationPropertyChangedEvent Vyvolá událost při změně vlastnosti model UI Automation.
RaiseStructureChangedEvent Vyvolá událost, když se změní struktura model UI Automation stromu, například odebráním nebo přidáním prvku.

Účelem události je informovat klienta o něčem, co probíhá v uživatelském rozhraní, zda je aktivita aktivována samotným systémem model UI Automation. Například událost identifikovaná uživatelem InvokedEvent by měla být vyvolána při každém vyvolání ovládacího prvku, a to buď prostřednictvím přímého uživatelského vstupu, nebo voláním Invokeklientské aplikace .

Aby bylo možné optimalizovat výkon, může poskytovatel selektivně vyvolat události nebo vyvolat vůbec žádné události, pokud není zaregistrovaná žádná klientská aplikace k jejich přijetí. Pro optimalizaci se používají následující metody.

metoda Popis
ClientsAreListening Tato statická vlastnost určuje, jestli se některé klientské aplikace přihlásily k odběru model UI Automation událostí.
IRawElementProviderAdviseEvents Implementace tohoto rozhraní poskytovatele v kořenovém adresáři fragmentu umožňuje, aby bylo doporučeno, když klienti zaregistrují a zruší registraci obslužných rutin událostí pro události v fragmentu.

Navigace zprostředkovatele jiného než WPF

Poskytovatelé jednoduchých ovládacích prvků, jako je vlastní tlačítko hostované v okně (HWND), nemusí podporovat navigaci ve stromu model UI Automation. Navigace do prvku a z tohoto prvku je zpracována výchozím poskytovatelem pro okno hostitele, které je zadáno v implementaci HostRawElementProvider. Při implementaci zprostředkovatele pro komplexní vlastní ovládací prvek však musíte podporovat navigaci mezi kořenovým uzlem fragmentu a jeho potomky a mezi uzly na stejné úrovni.

Poznámka:

Prvky jiného fragmentu než kořen musí vrátit null odkaz z HostRawElementProvider, protože nejsou přímo hostovány v okně a žádný výchozí zprostředkovatel nemůže podporovat navigaci do a z nich.

Struktura fragmentu je určena vaší implementací Navigate. Pro každý možný směr z každého fragmentu vrátí tato metoda objekt zprostředkovatele pro prvek v tomto směru. Pokud neexistuje žádný prvek v daném směru, metoda vrátí null odkaz.

Kořen fragmentu podporuje navigaci pouze na podřízené prvky. Například seznam vrátí první položku v seznamu, pokud je FirstChildsměr , a poslední položku, pokud je LastChildsměr . Kořen fragmentu nepodporuje navigaci na nadřazenou položku nebo na stejné úrovni; to zpracovává poskytovatel okna hostitele.

Prvky fragmentu, které nejsou kořenem, musí podporovat navigaci na nadřazenou položku a na všechny elementy na stejné úrovni a podřízené položky, které mají.

Přeučování jiných poskytovatelů než WPF

Automaticky otevíraná okna jsou ve skutečnosti okna nejvyšší úrovně a ve výchozím nastavení se ve stromu model UI Automation zobrazují jako podřízené položky plochy. V mnoha případech jsou však automaticky otevíraná okna logicky podřízená jiným ovládacím prvkům. Například rozevírací seznam pole se seznamem je logicky podřízený pole se seznamem. Podobně místní okno nabídky je logicky podřízenou položkou nabídky. model UI Automation poskytuje podporu pro překryvná automaticky otevíraná okna tak, aby vypadaly jako podřízené ovládací prvek.

Opětovné zobrazení automaticky otevíraných oken:

  1. Vytvořte zprostředkovatele pro automaticky otevírané okno. To vyžaduje, aby třída automaticky otevíraného okna byla předem známa.

  2. Implementujte všechny vlastnosti a vzory jako obvykle pro toto automaticky otevírané okno, jako by šlo o ovládací prvek ve svém vlastním právu.

  3. HostRawElementProvider Implementujte vlastnost tak, aby vrátil hodnotu získanou z HostProviderFromHandle, kde parametr je popisovač okna automaticky otevíraného okna.

  4. Implementujte Navigate pro automaticky otevírané okno a nadřazený objekt, aby navigace byla zpracována správně z logického nadřazeného objektu do logických podřízených položek a mezi podřízenými položkami na stejné úrovni.

Když model UI Automation narazí na automaticky otevírané okno, rozpozná, že se navigace přepíše z výchozího nastavení, a přeskočí automaticky otevírané okno, když se objeví jako podřízený počítač. Místo toho bude uzel dostupný pouze prostřednictvím fragmentu.

Přeučování není vhodné pro případy, kdy ovládací prvek může hostovat okno libovolné třídy. Například rebar může být hostitelem libovolného typu HWND v jeho pásmech. Pro zpracování těchto případů model UI Automation podporuje alternativní formu přemístění HWND, jak je popsáno v další části.

Změna umístění jiného poskytovatele než WPF

model UI Automation fragmenty mohou obsahovat dva nebo více prvků, které jsou obsaženy v okně (HWND). Vzhledem k tomu, že každý HWND má vlastní výchozího poskytovatele, který považuje HWND za dítě obsahující HWND, model UI Automation strom ve výchozím nastavení zobrazí HWND v fragmentu jako podřízené položky nadřazeného okna. Ve většině případů je to žádoucí chování, ale někdy může vést k nejasnostem, protože neodpovídá logické struktuře uživatelského rozhraní.

Dobrým příkladem je ovládací prvek rebaru. Rebar obsahuje pásy, z nichž každý může zase obsahovat ovládací prvek založený na HWND, jako je panel nástrojů, textové pole nebo pole se seznamem. Výchozí zprostředkovatel okna pro rebar HWND vidí ovládací jednotky HWND pásu jako děti a poskytovatel rebaru vidí pásy jako děti. Vzhledem k tomu, že poskytovatel HWND a poskytovatel rebaru pracují společně a kombinují své děti, jak pásy, tak ovládací prvky založené na HWND se zobrazují jako děti rebaru. Logicky by se ale jako podřízené pruhy měly objevit pouze pásma a každý poskytovatel pásma by měl být svázán s výchozím poskytovatelem HWND pro ovládací prvek, který obsahuje.

K tomu zprostředkovatele kořene fragmentu pro rebar zveřejňuje sadu podřízených objektů představujících pásma. Každá pásma má jednoho zprostředkovatele, který může vystavit vlastnosti a vzory. Ve své implementaci HostRawElementProvider, pásma poskytovatel vrátí výchozího zprostředkovatele okna pro řízení HWND, který získá voláním HostProviderFromHandle, předáváním obslužného úchytu ovládacího prvku. Nakonec poskytovatel kořene fragmentu pro rebar implementuje IRawElementProviderHwndOverride rozhraní a v jeho implementaci GetOverrideProviderForHwnd vrátí odpovídajícího poskytovatele pásma pro ovládací prvek obsažený v zadaném HWND.

Viz také