클라이언트 애플리케이션에서 UI 자동화 공급자 구현
참고 항목
이 설명서는 System.Windows.Automation 네임스페이스에 정의된 관리되는 UI 자동화 클래스를 사용하려는 .NET Framework 개발자를 위한 것입니다. UI 자동화에 대한 최신 정보는 Windows 자동화 API: UI 자동화를 참조하세요.
이 항목에는 애플리케이션 내에서 클라이언트 쪽 UI 자동화 공급자를 구현하는 방법을 보여 주는 예제 코드가 있습니다.
이 방법은 일반적인 시나리오는 아닙니다. 대부분의 경우, UI 자동화 클라이언트 애플리케이션은 서버 쪽 공급자 또는 DLL에 상주하는 클라이언트 쪽 공급자를 사용합니다.
예시
다음 코드 예제에서는 콘솔 창에 대한 간단한 공급자를 구현합니다. 이 코드에는 유용한 기능이 없지만, 클라이언트 코드 내에서 공급자를 설정하고 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