Udostępnij za pośrednictwem


Automatyzacja interfejsu użytkownika a Microsoft Active Accessibility

Uwaga

Ta dokumentacja jest przeznaczona dla deweloperów programu .NET Framework, którzy chcą używać zarządzanych klas automatyzacja interfejsu użytkownika zdefiniowanych w System.Windows.Automation przestrzeni nazw. Aby uzyskać najnowsze informacje na temat automatyzacja interfejsu użytkownika, zobacz Interfejs API usługi Windows Automation: automatyzacja interfejsu użytkownika.

Microsoft Active Accessibility to wcześniejsze rozwiązanie do udostępniania aplikacji. Microsoft automatyzacja interfejsu użytkownika to nowy model ułatwień dostępu dla systemu Microsoft Windows i ma na celu zaspokojenie potrzeb produktów technologii pomocniczych i narzędzi do zautomatyzowanego testowania. automatyzacja interfejsu użytkownika oferuje wiele ulepszeń dotyczących aktywnych ułatwień dostępu.

W tym temacie opisano główne funkcje automatyzacja interfejsu użytkownika i wyjaśniono, jak te funkcje różnią się od aktywnych ułatwień dostępu.

Języki programowania

Aktywne ułatwienia dostępu są oparte na modelu obiektów składników (COM) z obsługą podwójnych interfejsów i dlatego programowalne w języku C/C++, Microsoft Visual Basic 6.0 i językach skryptów. automatyzacja interfejsu użytkownika (w tym bibliotekę dostawcy po stronie klienta dla standardowych kontrolek) jest napisana w kodzie zarządzanym, a aplikacje klienckie automatyzacja interfejsu użytkownika są najłatwiej programowane przy użyciu języka C# lub Visual Basic .NET. automatyzacja interfejsu użytkownika dostawcy, którzy są implementacjami interfejsów, mogą być pisani w kodzie zarządzanym lub w języku C/C++.

Obsługa w programie Windows Presentation Foundation

Windows Presentation Foundation (WPF) to nowy model tworzenia interfejsów użytkownika. Elementy WPF nie zawierają natywnej obsługi aktywnych ułatwień dostępu; obsługują one jednak automatyzacja interfejsu użytkownika, co obejmuje obsługę mostkowania dla klientów z aktywnymi ułatwieniami dostępu. Tylko klienci napisani specjalnie dla automatyzacja interfejsu użytkownika mogą w pełni korzystać z funkcji ułatwień dostępu WPF, takich jak obsługa sformatowanego tekstu.

Serwery i klienci

W obszarze Aktywne ułatwienia dostępu serwery i klienci komunikują się bezpośrednio, głównie za pośrednictwem implementacji IAccessibleserwera programu .

W automatyzacja interfejsu użytkownika podstawowa usługa leży między serwerem (nazywanym dostawcą) a klientem. Podstawowa usługa wykonuje wywołania interfejsów implementowanych przez dostawców i udostępnia dodatkowe usługi, takie jak generowanie unikatowych identyfikatorów środowiska uruchomieniowego dla elementów. Aplikacje klienckie używają funkcji biblioteki do wywoływania usługi automatyzacja interfejsu użytkownika.

automatyzacja interfejsu użytkownika dostawcy mogą udostępniać informacje klientom z aktywnymi ułatwieniami dostępu, a serwery z aktywnymi ułatwieniami dostępu mogą udostępniać informacje automatyzacja interfejsu użytkownika aplikacji klienckich. Jednak ze względu na to, że aktywne ułatwienia dostępu nie uwidaczniają tak dużej ilości informacji, jak automatyzacja interfejsu użytkownika, te dwa modele nie są w pełni zgodne.

Elementy interfejsu użytkownika

Aktywne ułatwienia dostępu przedstawiają elementy interfejsu IAccessible użytkownika jako interfejs lub jako identyfikator podrzędny. Trudno jest porównać dwa IAccessible wskaźniki, aby ustalić, czy odwołują się do tego samego elementu.

W automatyzacja interfejsu użytkownika każdy element jest reprezentowany jako AutomationElement obiekt. Porównanie odbywa się przy użyciu operatora równości lub Equals metody, z których oba porównują unikatowe identyfikatory środowiska uruchomieniowego elementów.

Widoki drzewa i nawigacja

Elementy interfejsu użytkownika na ekranie można postrzegać jako strukturę drzewa z pulpitem głównym, oknami aplikacji jako bezpośrednimi elementami podrzędnymi i elementami w aplikacjach jako elementami podrzędnymi.

W obszarze Aktywne ułatwienia dostępu wiele elementów automatyzacji, które są nieistotne dla użytkowników końcowych, są widoczne w drzewie. Aplikacje klienckie muszą przyjrzeć się wszystkim elementom, aby określić, które z nich mają znaczenie.

automatyzacja interfejsu użytkownika aplikacje klienckie widzą interfejs użytkownika za pośrednictwem filtrowanego widoku. Widok zawiera tylko interesujące elementy: te, które dają informacje użytkownikowi lub umożliwiają interakcję. Wstępnie zdefiniowane widoki tylko elementów kontrolek i dostępne są tylko elementy zawartości; ponadto aplikacje mogą definiować widoki niestandardowe. automatyzacja interfejsu użytkownika upraszcza zadanie opisywania interfejsu użytkownika dla użytkownika i pomagania użytkownikowi w interakcji z aplikacją.

Nawigacja między elementami w aktywnej dostępności jest albo przestrzenna (na przykład przejście do elementu znajdującego się po lewej stronie ekranu), logiczne (na przykład przejście do następnego elementu menu lub następny element w kolejności tabulatora w oknie dialogowym) lub hierarchiczne (na przykład przeniesienie pierwszego dziecka w kontenerze lub z elementu podrzędnego do elementu nadrzędnego). Hierarchiczna nawigacja jest skomplikowana przez fakt, że elementy podrzędne nie zawsze są obiektami, które implementują IAccessibleelement .

W automatyzacja interfejsu użytkownika wszystkie elementy interfejsu użytkownika są AutomationElement obiektami obsługującymi te same podstawowe funkcje. (Z punktu widzenia dostawcy są to obiekty, które implementują interfejs dziedziczony z IRawElementProviderSimple.) Nawigacja jest głównie hierarchiczna: od rodziców do dzieci i od jednego rodzeństwa do następnego. (Nawigacja między elementami równorzędnymi ma element logiczny, ponieważ może to być zgodne z kolejnością tabulacji). Możesz przechodzić z dowolnego punktu początkowego przy użyciu dowolnego filtrowanego widoku drzewa przy użyciu TreeWalker klasy . Można również przejść do określonych elementów podrzędnych lub elementów potomnych przy użyciu poleceń FindFirst i FindAll. Na przykład bardzo łatwo jest pobrać wszystkie elementy w oknie dialogowym obsługującym określony wzorzec kontrolki.

Nawigacja w automatyzacja interfejsu użytkownika jest bardziej spójna niż w obszarze Aktywne ułatwienia dostępu. Niektóre elementy, takie jak listy rozwijane i okna podręczne, są wyświetlane dwa razy w drzewie Aktywne ułatwienia dostępu, a nawigacja z nich może mieć nieoczekiwane wyniki. W rzeczywistości nie można poprawnie zaimplementować aktywnej ułatwień dostępu dla kontrolki paska pomocniczego. automatyzacja interfejsu użytkownika umożliwia reparenting i repozycję, dzięki czemu element można umieścić w dowolnym miejscu w drzewie pomimo hierarchii nałożonej przez własność okien.

Role i typy kontrolek

Aktywne ułatwienia dostępu używają accRole właściwości (IAccessible::get_actRole), aby pobrać opis roli elementu w interfejsie użytkownika, na przykład ROLE_SYSTEM_SLIDER lub ROLE_SYSTEM_MENUITEM. Rola elementu jest główną wskazówką dla jego dostępnych funkcji. Interakcja z kontrolką jest osiągana przy użyciu stałych metod, takich jak IAccessible::accSelect i IAccessible::accDoDefaultAction. Interakcja między aplikacją kliencka a interfejsem użytkownika jest ograniczona do tego, co można zrobić za pośrednictwem usługi IAccessible.

Natomiast automatyzacja interfejsu użytkownika w dużej mierze rozdziela typ kontrolki elementu (opisanego ControlType przez właściwość) z oczekiwanej funkcjonalności. Funkcjonalność jest określana przez wzorce sterowania obsługiwane przez dostawcę za pośrednictwem implementacji wyspecjalizowanych interfejsów. Wzorce sterowania można połączyć w celu opisania pełnego zestawu funkcji obsługiwanych przez określony element interfejsu użytkownika. Niektórzy dostawcy muszą obsługiwać określony wzorzec kontroli; na przykład dostawca pola wyboru musi obsługiwać wzorzec kontrolki Przełączanie. Inni dostawcy są zobowiązani do obsługi co najmniej jednego zestawu wzorców kontroli; na przykład przycisk musi obsługiwać przełącznik lub wywołanie. Nadal inni nie obsługują żadnych wzorców kontroli w ogóle; na przykład okienko, którego nie można przenosić, zmieniać rozmiaru ani zadokować, nie ma żadnych wzorców sterujących.

automatyzacja interfejsu użytkownika obsługuje kontrolki niestandardowe, które są identyfikowane przez Custom właściwość i mogą być opisane przez LocalizedControlTypeProperty właściwość .

W poniższej tabeli przedstawiono mapowanie aktywnych ról ułatwień dostępu do automatyzacja interfejsu użytkownika typów kontrolek.

Aktywna rola ułatwień dostępu typ kontrolki automatyzacja interfejsu użytkownika
ROLE_SYSTEM_PUSHBUTTON Przycisk
ROLE_SYSTEM_CLIENT Calendar
ROLE_SYSTEM_CHECKBUTTON Pole wyboru
ROLE_SYSTEM_COMBOBOX Pole kombi
ROLE_SYSTEM_CLIENT Niestandardowy
ROLE_SYSTEM_LIST Siatka danych
ROLE_SYSTEM_LISTITEM Element danych
ROLE_SYSTEM_DOCUMENT Dokument
ROLE_SYSTEM_TEXT Edytuj
ROLE_SYSTEM_GROUPING Grupuj
ROLE_SYSTEM_LIST Nagłówek
ROLE_SYSTEM_COLUMNHEADER Element nagłówka
ROLE_SYSTEM_LINK Hiperlink
ROLE_SYSTEM_GRAPHIC Obraz
ROLE_SYSTEM_LIST List
ROLE_SYSTEM_LISTITEM Element listy
ROLE_SYSTEM_MENUPOPUP Menu
ROLE_SYSTEM_MENUBAR Pasek menu
ROLE_SYSTEM_MENUITEM Element menu
ROLE_SYSTEM_PANE Pane
ROLE_SYSTEM_PROGRESSBAR Pasek postępu
ROLE_SYSTEM_RADIOBUTTON Radio button
ROLE_SYSTEM_SCROLLBAR Pasek przewijania
ROLE_SYSTEM_SEPARATOR Separator
ROLE_SYSTEM_SLIDER Suwak
ROLE_SYSTEM_SPINBUTTON Spinner
ROLE_SYSTEM_SPLITBUTTON Przycisk Podziel
ROLE_SYSTEM_STATUSBAR Pasek stanu
ROLE_SYSTEM_PAGETABLIST Tab
ROLE_SYSTEM_PAGETAB Element karty
ROLE_SYSTEM_TABLE Table
ROLE_SYSTEM_STATICTEXT Text
ROLE_SYSTEM_INDICATOR Thumb
ROLE_SYSTEM_TITLEBAR Pasek tytułu
ROLE_SYSTEM_TOOLBAR Pasek narzędzi
ROLE_SYSTEM_TOOLTIP ToolTip
ROLE_SYSTEM_OUTLINE Drzewa
ROLE_SYSTEM_OUTLINEITEM Element drzewa
ROLE_SYSTEM_WINDOW Window

Aby uzyskać więcej informacji na temat różnych typów kontrolek, zobacz automatyzacja interfejsu użytkownika Typy kontrolek.

Stany i właściwości

W obszarze Aktywne ułatwienia dostępu elementy obsługują wspólny zestaw właściwości, a niektóre właściwości (takie jak accState) muszą opisywać bardzo różne elementy, w zależności od roli elementu. Serwery muszą implementować wszystkie metody IAccessible , które zwracają właściwość, nawet te, które nie są istotne dla elementu.

automatyzacja interfejsu użytkownika definiuje o wiele więcej właściwości, z których niektóre odpowiadają stanom w aktywnej dostępności. Niektóre są wspólne dla wszystkich elementów, ale inne są specyficzne dla typów kontrolek i wzorców kontrolek. Właściwości są rozróżniane przez unikatowe identyfikatory, a większość właściwości można pobrać przy użyciu jednej metody GetCurrentPropertyValue lub GetCachedPropertyValue. Wiele właściwości jest również łatwo pobieranych z Current metod dostępu właściwości i Cached .

Dostawca automatyzacja interfejsu użytkownika nie musi implementować nieistotnych właściwości, ale może po prostu zwrócić null wartość dla żadnych właściwości, które nie obsługuje. Ponadto usługa podstawowa automatyzacja interfejsu użytkownika może uzyskać niektóre właściwości od domyślnego dostawcy okien i są one połączone z właściwościami jawnie zaimplementowanymi przez dostawcę.

Oprócz obsługi wielu innych właściwości, automatyzacja interfejsu użytkownika zapewnia lepszą wydajność, umożliwiając pobieranie wielu właściwości za pomocą jednego wywołania między procesami.

W poniższej tabeli przedstawiono korespondencję między właściwościami w dwóch modelach.

Dostęp do właściwości Aktywne ułatwienia dostępu identyfikator właściwości automatyzacja interfejsu użytkownika Uwagi
get_accKeyboardShortcut AccessKeyProperty lub AcceleratorKeyProperty AccessKeyProperty ma pierwszeństwo, jeśli oba są obecne.
get_accName NameProperty
get_accRole ControlTypeProperty Zobacz poprzednią tabelę, aby uzyskać mapowanie ról na typy kontrolek.
get_accValue ValuePattern.ValueProperty

RangeValuePattern.ValueProperty
Prawidłowe tylko dla typów kontrolek, które obsługują ValuePattern lub RangeValuePattern. Wartości RangeValue są znormalizowane do 0–100, aby były zgodne z zachowaniem usługi MSAA. Elementy wartości używają ciągu.
get_accHelp HelpTextProperty
accLocation BoundingRectangleProperty
get_accDescription Nieobsługiwane w automatyzacja interfejsu użytkownika accDescription nie ma wyraźnej specyfikacji w programie MSAA, co spowodowało, że dostawcy umieszczali różne informacje w tej właściwości.
get_accHelpTopic Nieobsługiwane w automatyzacja interfejsu użytkownika

W poniższej tabeli przedstawiono, które właściwości automatyzacja interfejsu użytkownika odpowiadają stałym stanom stanu aktywnej dostępności.

Stan aktywnej ułatwień dostępu właściwość automatyzacja interfejsu użytkownika Wyzwala zmiany stanu?
STATE_SYSTEM_CHECKED Pole wyboru, ToggleStateProperty

Dla przycisku radiowego, IsSelectedProperty
Y
STATE_SYSTEM_COLLAPSED ExpandCollapseState = Collapsed Y
STATE_SYSTEM_EXPANDED ExpandCollapseState = Expanded lub PartiallyExpanded Y
STATE_SYSTEM_FOCUSABLE IsKeyboardFocusableProperty N
STATE_SYSTEM_FOCUSED HasKeyboardFocusProperty N
STATE_SYSTEM_HASPOPUP ExpandCollapsePattern dla elementów menu N
STATE_SYSTEM_INVISIBLE IsOffscreenProperty = prawda i GetClickablePoint przyczyny NoClickablePointException N
STATE_SYSTEM_LINKED ControlTypeProperty =

Hyperlink
N
STATE_SYSTEM_MIXED ToggleState = Indeterminate N
STATE_SYSTEM_MOVEABLE CanMoveProperty N
STATE_SYSTEM_MUTLISELECTABLE CanSelectMultipleProperty N
STATE_SYSTEM_OFFSCREEN IsOffscreenProperty = True N
STATE_SYSTEM_PROTECTED IsPasswordProperty N
STATE_SYSTEM_READONLY RangeValuePattern.IsReadOnlyProperty i ValuePattern.IsReadOnlyProperty N
STATE_SYSTEM_SELECTABLE SelectionItemPattern jest obsługiwana N
STATE_SYSTEM_SELECTED IsSelectedProperty N
STATE_SYSTEM_SIZEABLE CanResize N
STATE_SYSTEM_UNAVAILABLE IsEnabledProperty Y

Następujące stany nie zostały zaimplementowane przez większość aktywnych serwerów kontroli ułatwień dostępu lub nie mają odpowiedników w automatyzacja interfejsu użytkownika.

Stan aktywnej ułatwień dostępu Uwagi
STATE_SYSTEM_BUSY Niedostępne w automatyzacja interfejsu użytkownika
STATE_SYSTEM_DEFAULT Niedostępne w automatyzacja interfejsu użytkownika
STATE_SYSTEM_ANIMATED Niedostępne w automatyzacja interfejsu użytkownika
STATE_SYSTEM_EXTSELECTABLE Nieuwzgodnianie zaimplementowane przez aktywne serwery ułatwień dostępu
STATE_SYSTEM_MARQUEED Nieuwzgodnianie zaimplementowane przez aktywne serwery ułatwień dostępu
STATE_SYSTEM_SELFVOICING Nieuwzgodnianie zaimplementowane przez aktywne serwery ułatwień dostępu
STATE_SYSTEM_TRAVERSED Niedostępne w automatyzacja interfejsu użytkownika
STATE_SYSTEM_ALERT_HIGH Nieuwzgodnianie zaimplementowane przez aktywne serwery ułatwień dostępu
STATE_SYSTEM_ALERT_MEDIUM Nieuwzgodnianie zaimplementowane przez aktywne serwery ułatwień dostępu
STATE_SYSTEM_ALERT_LOW Nieuwzgodnianie zaimplementowane przez aktywne serwery ułatwień dostępu
STATE_SYSTEM_FLOATING Nieuwzgodnianie zaimplementowane przez aktywne serwery ułatwień dostępu
STATE_SYSTEM_HOTTRACKED Niedostępne w automatyzacja interfejsu użytkownika
STATE_SYSTEM_PRESSED Niedostępne w automatyzacja interfejsu użytkownika

Aby uzyskać pełną listę identyfikatorów właściwości automatyzacja interfejsu użytkownika, zobacz automatyzacja interfejsu użytkownika Properties Overview (Omówienie właściwości automatyzacja interfejsu użytkownika).

Zdarzenia

Mechanizm zdarzeń w automatyzacja interfejsu użytkownika, w przeciwieństwie do tego w aktywnej dostępności, nie polega na routingu zdarzeń systemu Windows (który jest ściśle powiązany z uchwytami okien) i nie wymaga, aby aplikacja kliencka skonfigurowała punkty zaczepienia. Subskrypcje zdarzeń można dostosować nie tylko do konkretnych zdarzeń, ale także do określonych części drzewa. Dostawcy mogą również dostroić ich zbieranie zdarzeń, śledząc, jakie zdarzenia są nasłuchiwane.

Klientom łatwiej jest również pobrać elementy, które zgłaszają zdarzenia, ponieważ są one przekazywane bezpośrednio do wywołania zwrotnego zdarzeń. Właściwości elementu są automatycznie pobierane wstępnie, jeśli żądanie pamięci podręcznej było aktywne, gdy klient subskrybował zdarzenie.

W poniższej tabeli przedstawiono korespondencję aktywnych zdarzeń WinEvents i automatyzacja interfejsu użytkownika ułatwień dostępu.

WinEvent identyfikator zdarzenia automatyzacja interfejsu użytkownika
EVENT_OBJECT_ACCELERATORCHANGE AcceleratorKeyProperty zmiana właściwości
EVENT_OBJECT_CONTENTSCROLLED VerticalScrollPercentProperty lub HorizontalScrollPercentProperty zmiana właściwości na skojarzonych paskach przewijania
EVENT_OBJECT_CREATE StructureChangedEvent
EVENT_OBJECT_DEFACTIONCHANGE Brak odpowiednika
EVENT_OBJECT_DESCRIPTIONCHANGE Nie ma dokładnego odpowiednika; być może HelpTextProperty lub LocalizedControlTypeProperty zmiana właściwości
EVENT_OBJECT_DESTROY StructureChangedEvent
EVENT_OBJECT_FOCUS AutomationFocusChangedEvent
EVENT_OBJECT_HELPCHANGE HelpTextProperty Zmienić
EVENT_OBJECT_HIDE StructureChangedEvent
EVENT_OBJECT_LOCATIONCHANGE BoundingRectangleProperty zmiana właściwości
EVENT_OBJECT_NAMECHANGE NameProperty zmiana właściwości
EVENT_OBJECT_PARENTCHANGE StructureChangedEvent
EVENT_OBJECT_REORDER Nie jest spójnie używany w aktywnych ułatwieniach dostępu. Nie zdefiniowano bezpośrednio odpowiedniego zdarzenia w automatyzacja interfejsu użytkownika.
EVENT_OBJECT_SELECTION ElementSelectedEvent
EVENT_OBJECT_SELECTIONADD ElementAddedToSelectionEvent
EVENT_OBJECT_SELECTIONREMOVE ElementRemovedFromSelectionEvent
EVENT_OBJECT_SELECTIONWITHIN Brak odpowiednika
EVENT_OBJECT_SHOW StructureChangedEvent
EVENT_OBJECT_STATECHANGE Różne zdarzenia zmienione właściwości
EVENT_OBJECT_VALUECHANGE RangeValuePattern.ValueProperty i ValuePattern.ValueProperty zmienione
EVENT_SYSTEM_ALERT Brak odpowiednika
EVENT_SYSTEM_CAPTUREEND Brak odpowiednika
EVENT_SYSTEM_CAPTURESTART Brak odpowiednika
EVENT_SYSTEM_CONTEXTHELPEND Brak odpowiednika
EVENT_SYSTEM_CONTEXTHELPSTART Brak odpowiednika
EVENT_SYSTEM_DIALOGEND WindowClosedEvent
EVENT_SYSTEM_DIALOGSTART WindowOpenedEvent
EVENT_SYSTEM_DRAGDROPEND Brak odpowiednika
EVENT_SYSTEM_DRAGDROPSTART Brak odpowiednika
EVENT_SYSTEM_FOREGROUND AutomationFocusChangedEvent
EVENT_SYSTEM_MENUEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPEND MenuClosedEvent
EVENT_SYSTEM_MENUPOPUPSTART MenuOpenedEvent
EVENT_SYSTEM_MENUSTART MenuOpenedEvent
EVENT_SYSTEM_MINIMIZEEND WindowVisualStateProperty zmiana właściwości
EVENT_SYSTEM_MINIMIZESTART WindowVisualStateProperty zmiana właściwości
EVENT_SYSTEM_MOVESIZEEND BoundingRectangleProperty zmiana właściwości
EVENT_SYSTEM_MOVESIZESTART BoundingRectangleProperty zmiana właściwości
EVENT_SYSTEM_SCROLLINGEND VerticalScrollPercentProperty lub HorizontalScrollPercentProperty zmiana właściwości
EVENT_SYSTEM_SCROLLINGSTART VerticalScrollPercentProperty lub HorizontalScrollPercentProperty zmiana właściwości
EVENT_SYSTEM_SOUND Brak odpowiednika
EVENT_SYSTEM_SWITCHEND Brak odpowiednika, ale AutomationFocusChangedEvent zdarzenie sygnalizuje, że nowa aplikacja otrzymała fokus
EVENT_SYSTEM_SWITCHSTART Brak odpowiednika
Brak odpowiednika CurrentViewProperty zmiana właściwości
Brak odpowiednika HorizontallyScrollableProperty zmiana właściwości
Brak odpowiednika VerticallyScrollableProperty zmiana właściwości
Brak odpowiednika HorizontalScrollPercentProperty zmiana właściwości
Brak odpowiednika VerticalScrollPercentProperty zmiana właściwości
Brak odpowiednika HorizontalViewSizeProperty zmiana właściwości
Brak odpowiednika VerticalViewSizeProperty zmiana właściwości
Brak odpowiednika ToggleStateProperty zmiana właściwości
Brak odpowiednika WindowVisualStateProperty zmiana właściwości
Brak odpowiednika AsyncContentLoadedEvent Zdarzenie
Brak odpowiednika ToolTipOpenedEvent

Zabezpieczenia

Niektóre IAccessible scenariusze dostosowywania wymagają zawijania bazy IAccessible i wywoływania do niej. Ma to wpływ na bezpieczeństwo, ponieważ częściowo zaufany składnik nie powinien być pośrednikiem w ścieżce kodu.

Model automatyzacja interfejsu użytkownika eliminuje potrzebę wywołania przez dostawców do innego kodu dostawcy. Podstawowa usługa automatyzacja interfejsu użytkownika wykonuje wszystkie niezbędne agregacje.

Zobacz też