使用 UI 自动化向文本框添加内容

注意注意

本文档的目标读者是欲使用 System.Windows.Automation 命名空间中定义的托管 UI Automation类的 .NET Framework 开发人员。有关 UI Automation的最新信息,请参见 Windows Automation API: UI Automation(Windows 自动化 API:UI 自动化)。

本主题包含代码示例,该代码示例演示如何使用 Microsoft UI Automation将文本插入单行文本框。 对于 UI Automation不适用的多行和多格式文本控件,提供了另一种方法。 为了进行比较,该示例还演示如何使用 Win32 方法来达到相同的结果。

示例

下面的示例将逐个通过目标应用程序中的一系列文本控件。 将对每个文本控件进行测试,以确定是否可以使用 TryGetCurrentPattern 方法从中获取 ValuePattern 对象。 如果文本控件确实支持 ValuePattern,将使用 SetValue 方法将用户定义的字符串插入文本控件。 否则,将使用 SendKeys.SendWait 方法。

        '' --------------------------------------------------------------------
        ''  <summary>
        ''  Sets the values of the text controls using managed methods.
        ''  </summary>
        ''  <param name="s">The string to be inserted.</param>
        '' --------------------------------------------------------------------
        Private Sub SetValueWithUIAutomation(ByVal s As String)
            Dim control As AutomationElement
            For Each control In textControls
                InsertTextWithUIAutomation(control, s)
            Next control

        End Sub


        '' --------------------------------------------------------------------
        ''  <summary>
        ''  Inserts a string into each text control of interest.
        ''  </summary>
        ''  <param name="element">A text control.</param>
        ''  <param name="value">The string to be inserted.</param>
        '' --------------------------------------------------------------------
        Private Sub InsertTextWithUIAutomation( _
        ByVal element As AutomationElement, ByVal value As String)
            Try
                ' Validate arguments / initial setup
                If value Is Nothing Then
                    Throw New ArgumentNullException( _
                    "String parameter must not be null.")
                End If

                If element Is Nothing Then
                    Throw New ArgumentNullException( _
                    "AutomationElement parameter must not be null")
                End If

                ' A series of basic checks prior to attempting an insertion.
                '
                ' Check #1: Is control enabled?
                ' An alternative to testing for static or read-only controls 
                ' is to filter using 
                ' PropertyCondition(AutomationElement.IsEnabledProperty, true) 
                ' and exclude all read-only text controls from the collection.
                If Not element.Current.IsEnabled Then
                    Throw New InvalidOperationException( _
                    "The control with an AutomationID of " + _
                    element.Current.AutomationId.ToString() + _
                    " is not enabled." + vbLf + vbLf)
                End If

                ' Check #2: Are there styles that prohibit us 
                '           from sending text to this control?
                If Not element.Current.IsKeyboardFocusable Then
                    Throw New InvalidOperationException( _
                    "The control with an AutomationID of " + _
                    element.Current.AutomationId.ToString() + _
                    "is read-only." + vbLf + vbLf)
                End If


                ' Once you have an instance of an AutomationElement,  
                ' check if it supports the ValuePattern pattern.
                Dim targetValuePattern As Object = Nothing

                ' Control does not support the ValuePattern pattern 
                ' so use keyboard input to insert content.
                '
                ' NOTE: Elements that support TextPattern 
                '       do not support ValuePattern and TextPattern
                '       does not support setting the text of 
                '       multi-line edit or document controls.
                '       For this reason, text input must be simulated
                '       using one of the following methods.
                '       
                If Not element.TryGetCurrentPattern(ValuePattern.Pattern, targetValuePattern) Then
                    feedbackText.Append("The control with an AutomationID of ") _
                    .Append(element.Current.AutomationId.ToString()) _
                    .Append(" does not support ValuePattern."). _
                    AppendLine(" Using keyboard input.").AppendLine()

                    ' Set focus for input functionality and begin.
                    element.SetFocus()

                    ' Pause before sending keyboard input.
                    Thread.Sleep(100)

                    ' Delete existing content in the control and insert new content.
                    SendKeys.SendWait("^{HOME}") ' Move to start of control
                    SendKeys.SendWait("^+{END}") ' Select everything
                    SendKeys.SendWait("{DEL}") ' Delete selection
                    SendKeys.SendWait(value)
                Else
                    ' Control supports the ValuePattern pattern so we can 
                    ' use the SetValue method to insert content.
                    feedbackText.Append("The control with an AutomationID of ") _
                    .Append(element.Current.AutomationId.ToString()) _
                    .Append(" supports ValuePattern.") _
                    .AppendLine(" Using ValuePattern.SetValue().").AppendLine()

                    ' Set focus for input functionality and begin.
                    element.SetFocus()
                    Dim valueControlPattern As ValuePattern = _
                    DirectCast(targetValuePattern, ValuePattern)
                    valueControlPattern.SetValue(value)
                End If
            Catch exc As ArgumentNullException
                feedbackText.Append(exc.Message)
            Catch exc As InvalidOperationException
                feedbackText.Append(exc.Message)
            Finally
                Feedback(feedbackText.ToString())
            End Try

        End Sub

///--------------------------------------------------------------------
/// <summary>
/// Sets the values of the text controls using managed methods.
/// </summary>
/// <param name="s">The string to be inserted.</param>
///--------------------------------------------------------------------
private void SetValueWithUIAutomation(string s)
{
    foreach (AutomationElement control in textControls)
    {
        InsertTextUsingUIAutomation(control, s);
    }
}

///--------------------------------------------------------------------
/// <summary>
/// Inserts a string into each text control of interest.
/// </summary>
/// <param name="element">A text control.</param>
/// <param name="value">The string to be inserted.</param>
///--------------------------------------------------------------------
private void InsertTextUsingUIAutomation(AutomationElement element, 
                                    string value)
{
    try
    {
        // Validate arguments / initial setup
        if (value == null)
            throw new ArgumentNullException(
                "String parameter must not be null.");

        if (element == null)
            throw new ArgumentNullException(
                "AutomationElement parameter must not be null");

        // A series of basic checks prior to attempting an insertion.
        //
        // Check #1: Is control enabled?
        // An alternative to testing for static or read-only controls 
        // is to filter using 
        // PropertyCondition(AutomationElement.IsEnabledProperty, true) 
        // and exclude all read-only text controls from the collection.
        if (!element.Current.IsEnabled)
        {
            throw new InvalidOperationException(
                "The control with an AutomationID of "
                + element.Current.AutomationId.ToString() 
                + " is not enabled.\n\n");
        }

        // Check #2: Are there styles that prohibit us 
        //           from sending text to this control?
        if (!element.Current.IsKeyboardFocusable)
        {
            throw new InvalidOperationException(
                "The control with an AutomationID of "
                + element.Current.AutomationId.ToString()
                + "is read-only.\n\n");
        }


        // Once you have an instance of an AutomationElement,  
        // check if it supports the ValuePattern pattern.
        object valuePattern = null;

        // Control does not support the ValuePattern pattern 
        // so use keyboard input to insert content.
        //
        // NOTE: Elements that support TextPattern 
        //       do not support ValuePattern and TextPattern
        //       does not support setting the text of 
        //       multi-line edit or document controls.
        //       For this reason, text input must be simulated
        //       using one of the following methods.
        //       
        if (!element.TryGetCurrentPattern(
            ValuePattern.Pattern, out valuePattern))
        {
            feedbackText.Append("The control with an AutomationID of ")
                .Append(element.Current.AutomationId.ToString())
                .Append(" does not support ValuePattern.")
                .AppendLine(" Using keyboard input.\n");

            // Set focus for input functionality and begin.
            element.SetFocus(); 

            // Pause before sending keyboard input.
            Thread.Sleep(100);

            // Delete existing content in the control and insert new content.
            SendKeys.SendWait("^{HOME}");   // Move to start of control
            SendKeys.SendWait("^+{END}");   // Select everything
            SendKeys.SendWait("{DEL}");     // Delete selection
            SendKeys.SendWait(value);
        }
        // Control supports the ValuePattern pattern so we can 
        // use the SetValue method to insert content.
        else
        {
            feedbackText.Append("The control with an AutomationID of ")
                .Append(element.Current.AutomationId.ToString())
                .Append((" supports ValuePattern."))
                .AppendLine(" Using ValuePattern.SetValue().\n");

            // Set focus for input functionality and begin.
            element.SetFocus();

            ((ValuePattern)valuePattern).SetValue(value);
        }
    }
    catch (ArgumentNullException exc)
    {
        feedbackText.Append(exc.Message);
    }
    catch (InvalidOperationException exc)
    {
        feedbackText.Append(exc.Message);
    }
    finally
    {
        Feedback(feedbackText.ToString());
    }
}

请参见

任务

ValuePattern Insert Text Sample