Acrescentar Conteúdo a um Text Box Utilizando Automação de IU

Observação

Esta documentação destina-se a desenvolvedores de .NET Framework que querem usar as classes da Automação da Interface do Usuário gerenciadas definidas no namespace System.Windows.Automation. Para obter as informações mais recentes sobre a Automação da Interface do Usuário, confira API de Automação do Windows: Automação da Interface do Usuário.

Este tópico contém código de exemplo que demonstra como usar o Microsoft Automação da Interface do Usuário para inserir texto em uma caixa de texto de linha única. Um método alternativo é fornecido para controles de texto avançado e de várias linhas em que Automação da Interface do Usuário não é aplicável. Para fins de comparação, o exemplo também demonstra como usar métodos Win32 para obter os mesmos resultados.

Exemplo

O exemplo a seguir percorre uma sequência de controles de texto em um aplicativo de destino. Cada controle de texto é testado para ver se um objeto ValuePattern pode ser obtido dele usando o método TryGetCurrentPattern. Se o controle de texto suportar ValuePattern, o método SetValue será usado para inserir uma cadeia de caracteres definida pelo usuário no controle de texto. Caso contrário, o método SendKeys.SendWait será usado.

///--------------------------------------------------------------------
/// <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());
    }
}
'' --------------------------------------------------------------------
''  <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

Confira também