UI オートメーションを使用したコントロールの呼び出し
Note
このドキュメントは、System.Windows.Automation 名前空間で定義されているマネージド UI オートメーション クラスを使用する .NET Framework 開発者を対象としています。 UI オートメーションの最新情報については、Windows Automation API の「UI オートメーション」を参照してください。
このトピックでは、次のタスクを実行する方法について示します。
ターゲット アプリケーションの UI オートメーション ツリーのコントロール ビューを調べて、特定のプロパティ条件に一致するコントロールを検索する。
各コントロールに対して AutomationElement を作成する。
InvokePattern コントロール パターンをサポートする UI オートメーション要素から InvokePattern オブジェクトを取得する。
Invoke を使用して、クライアントのイベント ハンドラーからコントロールを呼び出す。
例
この例では、 TryGetCurrentPattern クラスの AutomationElement メソッドを使用して InvokePattern オブジェクトを生成し、 Invoke メソッドを使用してコントロールを呼び出します。
///--------------------------------------------------------------------
/// <summary>
/// Walks the UI Automation tree of the target and reports the control
/// type of each element it finds in the control view to the client.
/// </summary>
/// <param name="targetTreeViewElement">
/// The root of the search on this iteration.
/// </param>
/// <param name="elementIndex">
/// The TreeView index for this iteration.
/// </param>
/// <remarks>
/// This is a recursive function that maps out the structure of the
/// subtree of the target beginning at the AutomationElement passed in
/// as the rootElement on the first call. This could be, for example,
/// an application window.
/// CAUTION: Do not pass in AutomationElement.RootElement. Attempting
/// to map out the entire subtree of the desktop could take a very
/// long time and even lead to a stack overflow.
/// </remarks>
///--------------------------------------------------------------------
private void FindTreeViewDescendants(
AutomationElement targetTreeViewElement, int treeviewIndex)
{
if (targetTreeViewElement == null)
return;
AutomationElement elementNode =
TreeWalker.ControlViewWalker.GetFirstChild(targetTreeViewElement);
while (elementNode != null)
{
Label elementInfo = new Label();
elementInfo.Margin = new Thickness(0);
clientTreeViews[treeviewIndex].Children.Add(elementInfo);
// Compile information about the control.
elementInfoCompile = new StringBuilder();
string controlName =
(elementNode.Current.Name == "") ?
"Unnamed control" : elementNode.Current.Name;
string autoIdName =
(elementNode.Current.AutomationId == "") ?
"No AutomationID" : elementNode.Current.AutomationId;
elementInfoCompile.Append(controlName)
.Append(" (")
.Append(elementNode.Current.ControlType.LocalizedControlType)
.Append(" - ")
.Append(autoIdName)
.Append(")");
// Test for the control patterns of interest for this sample.
object objPattern;
ExpandCollapsePattern expcolPattern;
if (true == elementNode.TryGetCurrentPattern(ExpandCollapsePattern.Pattern, out objPattern))
{
expcolPattern = objPattern as ExpandCollapsePattern;
if (expcolPattern.Current.ExpandCollapseState != ExpandCollapseState.LeafNode)
{
Button expcolButton = new Button();
expcolButton.Margin = new Thickness(0, 0, 0, 5);
expcolButton.Height = 20;
expcolButton.Width = 100;
expcolButton.Content = "ExpandCollapse";
expcolButton.Tag = expcolPattern;
expcolButton.Click +=
new RoutedEventHandler(ExpandCollapse_Click);
clientTreeViews[treeviewIndex].Children.Add(expcolButton);
}
}
TogglePattern togPattern;
if (true == elementNode.TryGetCurrentPattern(TogglePattern.Pattern, out objPattern))
{
togPattern = objPattern as TogglePattern;
Button togButton = new Button();
togButton.Margin = new Thickness(0, 0, 0, 5);
togButton.Height = 20;
togButton.Width = 100;
togButton.Content = "Toggle";
togButton.Tag = togPattern;
togButton.Click += new RoutedEventHandler(Toggle_Click);
clientTreeViews[treeviewIndex].Children.Add(togButton);
}
InvokePattern invPattern;
if (true == elementNode.TryGetCurrentPattern(InvokePattern.Pattern, out objPattern))
{
invPattern = objPattern as InvokePattern;
Button invButton = new Button();
invButton.Margin = new Thickness(0);
invButton.Height = 20;
invButton.Width = 100;
invButton.Content = "Invoke";
invButton.Tag = invPattern;
invButton.Click += new RoutedEventHandler(Invoke_Click);
clientTreeViews[treeviewIndex].Children.Add(invButton);
}
// Display compiled information about the control.
elementInfo.Content = elementInfoCompile;
Separator sep = new Separator();
clientTreeViews[treeviewIndex].Children.Add(sep);
// Iterate to next element.
// elementNode - Current element.
// treeviewIndex - Index of parent TreeView.
FindTreeViewDescendants(elementNode, treeviewIndex);
elementNode =
TreeWalker.ControlViewWalker.GetNextSibling(elementNode);
}
}
'''--------------------------------------------------------------------
''' <summary>
''' Walks the UI Automation tree of the target and reports the control
''' type of each element it finds in the control view to the client.
''' </summary>
''' <param name="targetTreeViewElement">
''' The root of the search on this iteration.
''' </param>
''' <param name="treeviewIndex">
''' The TreeView index for this iteration.
''' </param>
''' <remarks>
''' This is a recursive function that maps out the structure of the
''' subtree beginning at the AutomationElement passed in as
''' rootElement on the first call. This could be, for example,
''' an application window.
''' CAUTION: Do not pass in AutomationElement.RootElement. Attempting
''' to map out the entire subtree of the desktop could take a very
''' long time and even lead to a stack overflow.
''' </remarks>
'''--------------------------------------------------------------------
Private Sub FindTreeViewDescendants( _
ByVal targetTreeViewElement As AutomationElement, _
ByVal treeviewIndex As Integer)
If (IsNothing(targetTreeViewElement)) Then
Return
End If
Dim elementNode As AutomationElement = _
TreeWalker.ControlViewWalker.GetFirstChild(targetTreeViewElement)
While Not (elementNode Is Nothing)
Dim elementInfo As New Label()
elementInfo.Margin = New Thickness(0)
clientTreeViews(treeviewIndex).Children.Add(elementInfo)
' Compile information about the control.
elementInfoCompile = New StringBuilder()
Dim controlName As String
If (elementNode.Current.Name = "") Then
controlName = "Unnamed control"
Else
controlName = elementNode.Current.Name
End If
Dim autoIdName As String
If (elementNode.Current.AutomationId = "") Then
autoIdName = "No AutomationID"
Else
autoIdName = elementNode.Current.AutomationId
End If
elementInfoCompile.Append(controlName).Append(" (") _
.Append(elementNode.Current.ControlType.LocalizedControlType) _
.Append(" - ").Append(autoIdName).Append(")")
' Test for the control patterns of interest for this sample.
Dim objPattern As Object = Nothing
Dim expcolPattern As ExpandCollapsePattern
If True = elementNode.TryGetCurrentPattern(ExpandCollapsePattern.Pattern, objPattern) Then
expcolPattern = DirectCast(objPattern, ExpandCollapsePattern)
If expcolPattern.Current.ExpandCollapseState <> ExpandCollapseState.LeafNode Then
Dim expcolButton As New Button()
expcolButton.Margin = New Thickness(0, 0, 0, 5)
expcolButton.Height = 20
expcolButton.Width = 100
expcolButton.Content = "ExpandCollapse"
expcolButton.Tag = expcolPattern
AddHandler expcolButton.Click, AddressOf ExpandCollapse_Click
clientTreeViews(treeviewIndex).Children.Add(expcolButton)
End If
End If
Dim togPattern As TogglePattern
If True = elementNode.TryGetCurrentPattern(TogglePattern.Pattern, objPattern) Then
togPattern = DirectCast(objPattern, TogglePattern)
Dim togButton As New Button()
togButton.Margin = New Thickness(0, 0, 0, 5)
togButton.Height = 20
togButton.Width = 100
togButton.Content = "Toggle"
togButton.Tag = togPattern
AddHandler togButton.Click, AddressOf Toggle_Click
clientTreeViews(treeviewIndex).Children.Add(togButton)
End If
Dim invPattern As InvokePattern
If True = elementNode.TryGetCurrentPattern(InvokePattern.Pattern, objPattern) Then
invPattern = DirectCast(objPattern, InvokePattern)
Dim invButton As New Button()
invButton.Margin = New Thickness(0)
invButton.Height = 20
invButton.Width = 100
invButton.Content = "Invoke"
invButton.Tag = invPattern
AddHandler invButton.Click, AddressOf Invoke_Click
clientTreeViews(treeviewIndex).Children.Add(invButton)
End If
' Display compiled information about the control.
elementInfo.Content = elementInfoCompile
Dim sep As New Separator()
clientTreeViews(treeviewIndex).Children.Add(sep)
' Iterate to next element.
' elementNode - Current element.
' treeviewIndex - Index of parent TreeView.
FindTreeViewDescendants(elementNode, treeviewIndex)
elementNode = TreeWalker.ControlViewWalker.GetNextSibling(elementNode)
End While
End Sub
///--------------------------------------------------------------------
/// <summary>
/// Handles the Invoke click event on the client control.
/// The client click handler calls Invoke() on the equivalent target control.
/// </summary>
/// <param name="sender">The object that raised the event.</param>
/// <param name="e">Event arguments.</param>
/// <remarks>
/// The Tag property of the FrameworkElement, the client button in this
/// case, is used to store the InvokePattern object previously obtained
/// from the associated target control.
/// </remarks>
///--------------------------------------------------------------------
void Invoke_Click(object sender, RoutedEventArgs e)
{
Button clientButton = sender as Button;
InvokePattern targetInvokePattern = clientButton.Tag as InvokePattern;
if (targetInvokePattern == null)
return;
targetInvokePattern.Invoke();
statusText.Text = "Button invoked.";
}
'''--------------------------------------------------------------------
''' <summary>
''' Handles the Invoke click event on the client control.
''' The client click handler calls Invoke() on the equivalent target control.
''' </summary>
''' <param name="sender">The object that raised the event.</param>
''' <param name="e">Event arguments.</param>
''' <remarks>
''' The Tag property of the FrameworkElement, the client button in this
''' case, is used to store the InvokePattern object previously obtained
''' from the associated target control.
''' </remarks>
'''--------------------------------------------------------------------
Private Sub Invoke_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim clientButton As Button = DirectCast(sender, Button)
Dim targetInvokePattern As InvokePattern = _
DirectCast(clientButton.Tag, InvokePattern)
If (IsNothing(targetInvokePattern)) Then
Return
End If
targetInvokePattern.Invoke()
statusText.Text = "Button invoked."
End Sub