Megosztás a következőn keresztül:


Kiszolgálóoldali UI-automatizálás-szolgáltató implementálása

Feljegyzés

Ez a dokumentáció .NET-keretrendszer fejlesztőknek készült, akik a névtérben System.Windows.Automation meghatározott felügyelt UI-automatizálás osztályokat szeretnék használni. A UI-automatizálás kapcsolatos legfrissebb információkért lásd: Windows Automation API: UI-automatizálás.

Ez a szakasz azt ismerteti, hogyan implementálhat kiszolgálóoldali UI-automatizálás szolgáltatót egyéni vezérlőkhöz.

A Windows megjelenítési alaprendszer (WPF) és a nem WPF-elemek (például a Windows Formshoz tervezett) implementációja alapvetően eltér. A WPF-elemek támogatást nyújtanak a UI-automatizálás egy, a következőből származtatott osztályon AutomationPeerkeresztül. A nem WPF-elemek a szolgáltatói felületek implementációi révén nyújtanak támogatást.

Biztonsági szempontok

A szolgáltatókat meg kell írni, hogy részleges megbízhatósági környezetben működhessenek. Mivel UIAutomationClient.dll nincs konfigurálva részleges megbízhatósági futtatásra, a szolgáltatókód nem hivatkozhat erre a szerelvényre. Ha így tesz, előfordulhat, hogy a kód teljes megbízhatósági környezetben fut, de részleges megbízhatósági környezetben meghiúsul.

Különösen ne használjon olyan mezőket, amelyek a UIAutomationClient.dll osztályaiból AutomationElementszármaznak, például a . Ehelyett használja a UIAutomationTypes.dll osztályainak egyenértékű mezőit, például AutomationElementIdentifiers.

Szolgáltatói implementáció Windows megjelenítési alaprendszer elemek szerint

A témakörrel kapcsolatos további információkért tekintse meg a WPF egyéni vezérlőinek UI-automatizálás.

Szolgáltatói implementáció nem WPF-elemek szerint

Azok az egyéni vezérlők, amelyek nem részei a WPF-keretrendszernek, de felügyelt kódban vannak megírva (leggyakrabban Ezek a Windows Forms-vezérlők), interfészek implementálásával támogatják a UI-automatizálás. Minden elemnek végre kell hajtania a következő szakasz első táblázatában felsorolt felületek legalább egyikét. Emellett, ha az elem egy vagy több vezérlőmintát támogat, minden vezérlőmintához meg kell valósítania a megfelelő felületet.

A UI-automatizálás szolgáltatói projektnek a következő szerelvényekre kell hivatkoznia:

  • UIAutomationProviders.dll

  • UIAutomationTypes.dll

  • WindowsBase.dll

Szolgáltatói felületek

Minden UI-automatizálás szolgáltatónak az alábbi felületek egyikét kell implementálnia.

Interfész Leírás
IRawElementProviderSimple Egy ablakban üzemeltetett egyszerű vezérlő funkcióit biztosítja, beleértve a vezérlőminták és tulajdonságok támogatását is.
IRawElementProviderFragment Innen örököl: IRawElementProviderSimple. Egy összetett vezérlő egy elemének funkcióit adja hozzá, beleértve a töredéken belüli navigációt, a fókusz beállítását és az elem határoló téglalapjának visszaadását.
IRawElementProviderFragmentRoot Innen örököl: IRawElementProviderFragment. Egy összetett vezérlő gyökérelemének funkcióit adja hozzá, beleértve a gyermekelem meghatározott koordinátákon való helyét és a teljes vezérlő fókuszállapotának beállítását.

A következő felületek további funkciókat biztosítanak, de nem szükséges implementálásuk.

Interfész Leírás
IRawElementProviderAdviseEvents Lehetővé teszi a szolgáltató számára az eseményekre vonatkozó kérések nyomon követését.
IRawElementProviderHwndOverride Lehetővé teszi az ablakalapú elemek áthelyezését egy töredék UI-automatizálás fáján belül.

A névtérben lévő System.Windows.Automation.Provider összes többi adapter a vezérlőminta támogatásához használható.

Nem WPF-szolgáltatókra vonatkozó követelmények

A UI-automatizálás való kommunikációhoz a vezérlőnek a következő fő funkciókat kell megvalósítania:

Funkciók Megvalósítás
A szolgáltató felfedése UI-automatizálás A vezérlőablakba küldött WM_GETOBJECT üzenetre válaszul adja vissza a megvalósító IRawElementProviderSimple objektumot (vagy egy származtatott felületet). A töredékek esetében ennek kell lennie a töredékgyökér szolgáltatójának.
Tulajdonságértékek megadása Implementálás GetPropertyValue értékek megadásához vagy felülbírálásához.
A vezérlővel való interakció engedélyezése az ügyfél számára Olyan interfészek implementálása, amelyek támogatják a szabályozási mintákat, például IInvokeProvider. Adja vissza ezeket a mintaszolgáltatókat a implementációjában GetPatternProvider.
Események emelése Hívja meg az egyik statikus módszert AutomationInteropProvider egy olyan esemény indítására, amelyet az ügyfél figyelhet.
Navigáció engedélyezése és összpontosítás egy töredéken belül Implementálás IRawElementProviderFragment a töredék minden egyes eleméhez. (Nem szükséges olyan elemekhez, amelyek nem részei a töredéknek.)
Gyermekelem fókuszának és helyének engedélyezése egy töredékben Implementálás IRawElementProviderFragmentRoot. (Nem szükséges olyan elemekhez, amelyek nem töredezett gyökerek.)

Tulajdonságértékek nem WPF-szolgáltatókban

UI-automatizálás egyéni vezérlők szolgáltatóinak támogatniuk kell bizonyos tulajdonságokat, amelyeket az automatizálási rendszer és az ügyfélalkalmazások használhatnak. Az ablakokban (HWND-k) üzemeltetett elemek esetében UI-automatizálás lekérhetnek bizonyos tulajdonságokat az alapértelmezett ablakszolgáltatótól, de másokat is be kell szereznie az egyéni szolgáltatótól.

A HWND-alapú vezérlők szolgáltatóinak általában nem kell megadniuk a következő tulajdonságokat (mezőértékekkel azonosítva):

Feljegyzés

Az RuntimeIdProperty ablakban üzemeltetett egyszerű elem vagy töredékgyökér az ablakból származik, azonban a gyökér alatti töredékelemeknek (például egy listamező listaelemeinek) meg kell adniuk a saját azonosítójukat. További információ: GetRuntimeId.

A IsKeyboardFocusableProperty Windows Forms-vezérlőben üzemeltetett szolgáltatók esetében a visszaadott értéknek kell lennie. Ebben az esetben előfordulhat, hogy az alapértelmezett ablakszolgáltató nem tudja lekérni a megfelelő értéket.

Ezt NameProperty általában a gazdagépszolgáltató biztosítja. Ha például egy egyéni vezérlő származik Controlbelőle, a név a Text vezérlő tulajdonságából származik.

Lásd például a UI-automatizálás-szolgáltató tulajdonságainak visszaadása című témakört.

Események nem WPF-szolgáltatókban

UI-automatizálás szolgáltatóknak eseményeket kell létrehozniuk, hogy értesítsék az ügyfélalkalmazásokat a felhasználói felület állapotának változásairól. A következő módszereket használják az események létrehozásához.

Metódus Leírás
RaiseAutomationEvent Különböző eseményeket indít el, beleértve a vezérlőminták által aktivált eseményeket is.
RaiseAutomationPropertyChangedEvent Eseményt hoz létre, ha egy UI-automatizálás tulajdonság megváltozott.
RaiseStructureChangedEvent Eseményt hoz létre, ha a UI-automatizálás fa szerkezete megváltozott, például egy elem eltávolításával vagy hozzáadásával.

Az esemény célja, hogy értesítse az ügyfelet arról, hogy valami történik a felhasználói felületen (UI), függetlenül attól, hogy a tevékenységet maga a UI-automatizálás rendszer aktiválja-e. Az általa InvokedEvent azonosított eseményt például a vezérlő meghívásakor vagy közvetlen felhasználói bemeneten vagy az ügyfélalkalmazás hívásán Invokekeresztül kell elindítani.

A teljesítmény optimalizálása érdekében a szolgáltató szelektíven hozhat létre eseményeket, vagy egyáltalán nem hozhat létre eseményeket, ha nincs regisztrálva ügyfélalkalmazás a fogadásukra. A rendszer az alábbi módszereket használja az optimalizáláshoz.

Metódus Leírás
ClientsAreListening Ez a statikus tulajdonság azt határozza meg, hogy az ügyfélalkalmazások feliratkoztak-e UI-automatizálás eseményekre.
IRawElementProviderAdviseEvents Az interfész a töredékgyökér szolgáltató általi implementációja lehetővé teszi, hogy az ügyfelek regisztrálják és törölje az eseménykezelők regisztrációját a töredéken lévő eseményekhez.

Nem WPF-szolgáltató navigációja

Az olyan egyszerű vezérlők szolgáltatóinak, mint például egy ablakban üzemeltetett egyéni gomb (HWND) nem kell támogatniuk a UI-automatizálás fán belüli navigációt. Az elemre való navigálást a gazdagépablak alapértelmezett szolgáltatója kezeli, amely a gazdaablak implementálásában HostRawElementProvidervan megadva. Ha azonban egy szolgáltatót implementál egy összetett egyéni vezérlőhöz, támogatnia kell a töredék gyökércsomópontja és leszármazottai közötti, valamint a testvércsomópontok közötti navigációt.

Feljegyzés

A gyökértől eltérő töredék elemeinek HostRawElementProvidervissza kell adniuk a null hivatkozásokat, mert azok nem közvetlenül egy ablakban vannak tárolva, és egyetlen alapértelmezett szolgáltató sem támogatja a hozzájuk való navigálást.

A töredék szerkezetét a .Navigate Az egyes töredékekből származó lehetséges irányok esetében ez a metódus az elem szolgáltatóobjektumát adja vissza ebben az irányban. Ha nincs elem ebben az irányban, a metódus egy null hivatkozást ad vissza.

A töredékgyökér csak a gyermekelemekre való navigálást támogatja. Egy listamező például a lista első elemét adja vissza, ha az irány az , FirstChildés az utolsó elemet, ha az irány az LastChild. A töredékgyökér nem támogatja a szülőre vagy testvérekre való navigálást; ezt a gazdagépablak-szolgáltató kezeli.

A nem gyökérként megadott töredék elemeinek támogatniuk kell a szülőre, illetve az esetleges testvéreikre és gyermekeikre való navigálást.

Nem WPF-szolgáltató újratelepítése

Az előugró ablakok valójában legfelső szintű ablakok, ezért alapértelmezés szerint az asztal gyermekeiként jelennek meg a UI-automatizálás fában. Sok esetben azonban az előugró ablakok logikailag valamilyen más vezérlő gyermekei. A kombinált lista legördülő listája például logikailag a kombinált lista gyermekeleme. Hasonlóképpen, a menü előugró ablaka logikailag a menü gyermeke. UI-automatizálás támogatja az előugró ablakok újratelepítését, hogy azok a társított vezérlő gyermekeinek tűnjenek.

Előugró ablak újbóli küldése:

  1. Hozzon létre egy szolgáltatót az előugró ablakhoz. Ehhez előre ismernie kell az előugró ablak osztályát.

  2. Az előugró ablak minden tulajdonságát és mintáját a szokásos módon implementálhatja, mintha saját jogán vezérlő lenne.

  3. Implementálja a HostRawElementProvider tulajdonságot úgy, hogy visszaadja a kapott HostProviderFromHandleértéket, ahol a paraméter az előugró ablak ablakkezelője.

  4. Implementálja Navigate az előugró ablakot és annak szülőjét, hogy a navigáció megfelelően legyen kezelve a logikai szülőtől a logikai gyermekekig és a testvérgyermekek között.

Amikor UI-automatizálás találkozik az előugró ablakkal, felismeri, hogy a navigáció felül van bírálva az alapértelmezett értéken, és átugorja az előugró ablakot, amikor az asztal gyermekeként történik. Ehelyett a csomópont csak a töredéken keresztül lesz elérhető.

Az újratelepítés nem alkalmas olyan esetekre, amikor egy vezérlő bármilyen osztály ablakát üzemeltetheti. Egy sáv például bármilyen típusú HWND-t üzemeltethet a sávjaiban. Az ilyen esetek kezeléséhez UI-automatizálás támogatja a HWND áthelyezésének alternatív formáját, a következő szakaszban leírtak szerint.

Nem WPF-szolgáltató áthelyezése

UI-automatizálás töredékek két vagy több olyan elemet tartalmazhatnak, amelyek mindegyike egy ablakban (HWND) található. Mivel minden HWND saját alapértelmezett szolgáltatóval rendelkezik, amely a HWND-t egy tartalmazó HWND gyermekének tekinti, a UI-automatizálás fa alapértelmezés szerint a szülőablak gyermekeiként jeleníti meg a töredékben lévő HWND-ket. A legtöbb esetben ez kívánatos viselkedés, de néha zavart okozhat, mert nem egyezik a felhasználói felület logikai szerkezetével.

Erre jó példa a sávvezérlő. A sávok sávokat tartalmaznak, amelyek mindegyike tartalmazhat HWND-alapú vezérlőt, például eszköztárat, szerkesztődobozt vagy kombinált listát. A HWND sáv alapértelmezett ablakszolgáltatója gyermekként látja a sávvezérlő HWND-ket, a sávszolgáltató pedig gyermekként látja a sávokat. Mivel a HWND-szolgáltató és a rebar szolgáltató együtt dolgozik a gyermekeikkel, a sávok és a HWND-alapú vezérlők a rebar gyermekeiként jelennek meg. Logikailag azonban csak a sávok jelenjenek meg a sáv gyermekeiként, és minden sávszolgáltatót az alapértelmezett HWND-szolgáltatóval kell összekapcsolni a benne található vezérlőhöz.

Ennek érdekében a sávtöredék gyökérszolgáltatója a sávokat képviselő gyermekek egy csoportját teszi elérhetővé. Minden sáv egyetlen szolgáltatóval rendelkezik, amely tulajdonságokat és mintákat tehet közzé. A sávszolgáltató a HWND vezérlő alapértelmezett ablakszolgáltatóját HostRawElementProvideradja vissza, amelyet hívással HostProviderFromHandleszerez be, és átadja a vezérlő ablakleírójának. Végül a rebar töredék gyökérszolgáltatója implementálja az IRawElementProviderHwndOverride interfészt, és annak megvalósítása során GetOverrideProviderForHwnd visszaadja a megfelelő sávszolgáltatót a megadott HWND-ben található vezérlőhöz.

Lásd még