Поделиться через


Создание поставщика модели автоматизации пользовательского интерфейса на стороне клиента

Примечание.

Эта документация предназначена для разработчиков .NET Framework, желающих использовать управляемые классы автоматизации пользовательского интерфейса, определенные в пространстве имен System.Windows.Automation. Последние сведения об автоматизации пользовательского интерфейса см. в статье API автоматизации Windows. Автоматизация пользовательского интерфейса.

В этом разделе содержится пример кода, демонстрирующий реализацию клиентского поставщика автоматизации пользовательского интерфейса.

Пример

В следующем примере кода можно встроить в библиотеку динамических ссылок (DLL), которая реализует очень простой поставщик на стороне клиента для окна консоли. Код не имеет никаких полезных функциональных возможностей, он предназначен для демонстрации основных действий по настройке сборки поставщика, которая может быть зарегистрирована клиентским приложением модели автоматизации пользовательского интерфейса.

using System;
using System.Windows.Automation;
using System.Windows.Automation.Provider;

namespace ClientSideProviderAssembly
{
    // The assembly must implement a UIAutomationClientSideProviders class,
    // and the namespace must be the same as the name of the DLL, so that
    // UI Automation can find the table of descriptors. In this example,
    // the DLL would be "ClientSideProviderAssembly.dll"

    static class UIAutomationClientSideProviders
    {
        /// <summary>
        /// Implementation of the static ClientSideProviderDescriptionTable field.
        /// In this case, only a single provider is listed in the table.
        /// </summary>
        public static ClientSideProviderDescription[] ClientSideProviderDescriptionTable =
            {
                new ClientSideProviderDescription(
                    // Method that creates the provider object.
                    new ClientSideProviderFactoryCallback(ConsoleProvider.Create),
                    // Class of window that will be served by the provider.
                    "ConsoleWindowClass")
            };
    }

    class ConsoleProvider : IRawElementProviderSimple
    {
        IntPtr providerHwnd;

        public ConsoleProvider(IntPtr hwnd)
        {
            providerHwnd = hwnd;
        }

        internal static IRawElementProviderSimple Create(
            IntPtr hwnd, int idChild, int idObject)
        {
            // This provider doesn't expose children, so never expects
            // nonzero values for idChild.
            if (idChild != 0)
                return null;
            else
                return new ConsoleProvider(hwnd);
        }

        private static IRawElementProviderSimple Create(
            IntPtr hwnd, int idChild)
        {
            // Something is wrong if idChild is not 0.
            if (idChild != 0) return null;
            else return new ConsoleProvider(hwnd);
        }

        #region IRawElementProviderSimple

        // This is a skeleton implementation. The only real functionality
        // at this stage is to return the name of the element and the host
        // window provider, which can supply other properties.

        ProviderOptions IRawElementProviderSimple.ProviderOptions
        {
            get
            {
                return ProviderOptions.ClientSideProvider;
            }
        }

        IRawElementProviderSimple IRawElementProviderSimple.HostRawElementProvider
        {
            get
            {
                return AutomationInteropProvider.HostProviderFromHandle(providerHwnd);
            }
        }

        object IRawElementProviderSimple.GetPropertyValue(int propertyId)
        {
            if (propertyId == AutomationElementIdentifiers.NameProperty.Id)
                return "Custom Console Window";
            else
                return null;
        }

        object IRawElementProviderSimple.GetPatternProvider(int iid)
        {
            return null;
        }
        #endregion IRawElementProviderSimple
    }
}

Imports System.Windows.Automation
Imports System.Windows.Automation.Provider

Namespace ClientSideProviderAssembly
    ' The assembly must implement a UIAutomationClientSideProviders class, 
    ' and the namespace must be the same as the name of the DLL, so that 
    ' UI Automation can find the table of descriptors. In this example, 
    ' the DLL would be "ClientSideProviderAssembly.dll"

    Friend NotInheritable Class UIAutomationClientSideProviders
        ''' <summary>
        ''' Implementation of the static ClientSideProviderDescriptionTable field. 
        ''' In this case, only a single provider is listed in the table.
        ''' </summary>
        Public Shared ClientSideProviderDescriptionTable() As ClientSideProviderDescription = { New ClientSideProviderDescription(New ClientSideProviderFactoryCallback(AddressOf ConsoleProvider.Create), "ConsoleWindowClass") }
                    ' Method that creates the provider object.
                    ' Class of window that will be served by the provider.
    End Class

    Friend Class ConsoleProvider
        Implements IRawElementProviderSimple
        Private providerHwnd As IntPtr

        Public Sub New(ByVal hwnd As IntPtr)
            providerHwnd = hwnd
        End Sub

        Friend Shared Function Create(ByVal hwnd As IntPtr, ByVal idChild As Integer, ByVal idObject As Integer) As IRawElementProviderSimple
            ' This provider doesn't expose children, so never expects 
            ' nonzero values for idChild.
            If idChild <> 0 Then
                Return Nothing
            Else
                Return New ConsoleProvider(hwnd)
            End If

        End Function

        Private Shared Function Create(ByVal hwnd As IntPtr, ByVal idChild As Integer) As IRawElementProviderSimple
            ' Something is wrong if idChild is not 0.
            If idChild <> 0 Then
                Return Nothing
            Else
                Return New ConsoleProvider(hwnd)
            End If
        End Function

        #Region "IRawElementProviderSimple"

        ' This is a skeleton implementation. The only real functionality 
        ' at this stage is to return the name of the element and the host 
        ' window provider, which can supply other properties.

        Private ReadOnly Property IRawElementProviderSimple_ProviderOptions() As ProviderOptions Implements IRawElementProviderSimple.ProviderOptions
            Get
                Return ProviderOptions.ClientSideProvider
            End Get
        End Property

        Private ReadOnly Property HostRawElementProvider() As IRawElementProviderSimple Implements IRawElementProviderSimple.HostRawElementProvider
            Get
                Return AutomationInteropProvider.HostProviderFromHandle(providerHwnd)
            End Get
        End Property

        Private Function GetPropertyValue(ByVal propertyId As Integer) As Object Implements IRawElementProviderSimple.GetPropertyValue
            If propertyId = AutomationElementIdentifiers.NameProperty.Id Then
                Return "Custom Console Window"
            Else
                Return Nothing
            End If

        End Function

        Private Function GetPatternProvider(ByVal iid As Integer) As Object Implements IRawElementProviderSimple.GetPatternProvider
            Return Nothing
        End Function
        #End Region ' IRawElementProviderSimple
    End Class
End Namespace

См. также