UI オートメーションを使用した、テキスト ボックスへのコンテンツの追加Add Content to a Text Box Using UI Automation

注意

このドキュメントは、UI オートメーションUI Automation 名前空間で定義されているマネージド System.Windows.Automation クラスを使用する .NET Framework 開発者を対象としています。This documentation is intended for .NET Framework developers who want to use the managed UI オートメーションUI Automation classes defined in the System.Windows.Automation namespace. UI オートメーションUI Automationの最新情報については、「 Windows Automation API: UI オートメーション」を参照してください。For the latest information about UI オートメーションUI Automation, see Windows Automation API: UI Automation.

このトピックでは、Microsoft UI オートメーションMicrosoft UI Automation を使用して1行のテキストボックスにテキストを挿入する方法を示すコード例について説明します。This topic contains example code that demonstrates how to use Microsoft UI オートメーションMicrosoft UI Automation to insert text into a single-line text box. UI オートメーションUI Automation が適用されない複数行およびリッチテキストコントロールには、代替の方法が用意されています。An alternate method is provided for multi-line and rich text controls where UI オートメーションUI Automation is not applicable. 比較のために、この例では、Win32 メソッドを使用して同じ結果を実現する方法も示しています。For comparison purposes, the example also demonstrates how to use Win32 methods to accomplish the same results.

Example

次の例では、対象アプリケーションのテキストコントロールのシーケンスをステップ実行します。The following example steps through a sequence of text controls in a target application. 各テキストコントロールは、TryGetCurrentPattern メソッドを使用して ValuePattern オブジェクトを取得できるかどうかをテストします。Each text control is tested to see if a ValuePattern object can be obtained from it using the TryGetCurrentPattern method. テキストコントロールで ValuePatternがサポートされている場合は、SetValue メソッドを使用して、ユーザー定義の文字列をテキストコントロールに挿入します。If the text control does support ValuePattern, the SetValue method is used to insert a user-defined string into the text control. それ以外の場合は、SendKeys.SendWait メソッドが使用されます。Otherwise, the SendKeys.SendWait method is used.

///--------------------------------------------------------------------
/// <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

参照See also