创建客户端 UI 自动化提供程序
备注
本文档适用于想要使用 System.Windows.Automation 命名空间中定义的托管 UI 自动化类的 .NET Framework 开发人员。 有关 UI 自动化的最新信息,请参阅 Windows 自动化 API:UI 自动化。
本主题所包含的代码示例演示如何实现客户端 UI 自动化提供程序。
示例
下面的代码示例可内置于动态链接库 (DLL),后者实现控制台窗口的十分简单的客户端提供程序。 此代码不具有任何有用的功能,只是用于演示设置提供程序程序集的基本步骤,该程序集可由 UI 自动化客户端应用程序进行注册。
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