Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

Implement UI Automation Providers in a Client Application

Note

This documentation is intended for .NET Framework developers who want to use the managed UI Automation classes defined in the System.Windows.Automation namespace. For the latest information about UI Automation, see Windows Automation API: UI Automation.

This topic contains example code that shows how to implement a client-side UI Automation provider within an application.

This is an uncommon scenario. Most often, a UI Automation client application uses server-side providers, or client-side providers that reside in a DLL.

Example

The following example code implements a simple provider for a console window. The code does not have any useful functionality, but is intended to demonstrate the basic steps in setting up a provider within client code and registering it by using RegisterClientSideProviders.

using System;
using System.Windows.Automation;
using System.Windows.Automation.Provider;
using System.Reflection;
using System.Runtime.InteropServices;
using System.IO;

namespace CSClientProviderImplementation
{
 class CSClientSideImplementationProgram
 {
 [DllImport("kernel32.dll")]
 static extern IntPtr GetConsoleWindow();

 static void Main(string[] args)
 {

 ClientSettings.RegisterClientSideProviders(
 UIAutomationClientSideProviders.ClientSideProviderDescriptionTable);

 IntPtr hwnd = GetConsoleWindow();

 // Get an AutomationElement that represents the window.
 AutomationElement elementWindow = AutomationElement.FromHandle(hwnd);
 Console.WriteLine("Found UI Automation client-side provider for:");

 // The name property is furnished by the client-side provider.
 Console.WriteLine(elementWindow.Current.Name);
 Console.WriteLine();

 Console.WriteLine("Press any key to exit.");
 Console.ReadLine();
 }
 } // CSClientSideImplementationProgram class

 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.
 WindowProvider.Create,
 // Class of window that will be served by the provider.
 "ConsoleWindowClass") };
 }

 class WindowProvider : IRawElementProviderSimple
 {
 IntPtr providerHwnd;

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

 internal static IRawElementProviderSimple Create(
 IntPtr hwnd, int idChild, int idObject)
 {
 return Create(hwnd, idChild);
 }

 private static IRawElementProviderSimple Create(
 IntPtr hwnd, int idChild)
 {
 // Something is wrong if idChild is not 0.
 if (idChild != 0) return null;
 else return new WindowProvider(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 aid)
 {
 if (AutomationProperty.LookupById(aid) ==
 AutomationElementIdentifiers.NameProperty)
 {
 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
Imports System.Reflection
Imports System.Runtime.InteropServices
Imports System.IO


Namespace CSClientProviderImplementation
 Friend Class CSClientSideImplementationProgram
 <DllImport("kernel32.dll")>
 Shared Function GetConsoleWindow() As IntPtr
 End Function


 Shared Sub Main(ByVal args() As String)

 ClientSettings.RegisterClientSideProviders(UIAutomationClientSideProviders.ClientSideProviderDescriptionTable)

 Dim hwnd As IntPtr = GetConsoleWindow()

 ' Get an AutomationElement that represents the window. 
 Dim elementWindow As AutomationElement = AutomationElement.FromHandle(hwnd)
 Console.WriteLine("Found UI Automation client-side provider for:")

 ' The name property is furnished by the client-side provider.
 Console.WriteLine(elementWindow.Current.Name)
 Console.WriteLine()

 Console.WriteLine("Press any key to exit.")
 Console.ReadLine()
 End Sub
 End Class


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

 Friend Class WindowProvider
 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
 Return Create(hwnd, idChild)
 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 WindowProvider(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 aid As Integer) As Object Implements IRawElementProviderSimple.GetPropertyValue
 If AutomationProperty.LookupById(aid) Is AutomationElementIdentifiers.NameProperty 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

See also

Additional resources