UI Automation - Установить текст для TextBox другого приложения - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть две формы.Когда кнопка нажимается в одном из них, я хочу открыть другой и заполнить текстовое поле в нем.Я попытался с кодом ниже, но он выдает ошибку, которая говорит: «Неподдерживаемый шаблон».

Вот мой код:

private void button1_Click(object sender, EventArgs e)
{
    string automationId = "Form1";
    string newTextBoxValue = "user1";
    var condition = new PropertyCondition(AutomationElement.AutomationIdProperty, automationId);
    var textBox = AutomationElement.RootElement.FindFirst(TreeScope.Subtree, condition);
    ValuePattern vPattern = (ValuePattern)textBox.GetCurrentPattern(ValuePattern.Pattern);
    vPattern.SetValue(newTextBoxValue);
}

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Сначала необходимо проверить наличие шаблона ValuePattern:

  • Если шаблон ValuePattern доступен, используйте метод SetValue.
  • В противном случае используйтеодно из следующих решений:
    1. Установите фокус на элемент управления и используйте SendKeys для очистки и установки текста.
    2. Или используйте SendMessage и отправьте сообщение WM_SETTEXT, чтобы установитьтекст,

Пример

var notepad = System.Diagnostics.Process.GetProcessesByName("notepad").FirstOrDefault();
if (notepad != null)
{
    var root = AutomationElement.FromHandle(notepad.MainWindowHandle);
    var element = root.FindAll(TreeScope.Subtree, Condition.TrueCondition)
                        .Cast<AutomationElement>()
                        .Where(x => x.Current.ClassName == "Edit" &&
                                    x.Current.AutomationId == "15").FirstOrDefault();
    if (element != null)
    {
        if (element.TryGetCurrentPattern(ValuePattern.Pattern, out object pattern))
        {
            ((ValuePattern)pattern).SetValue("Something!");
        }
        else
        {
            element.SetFocus();
            SendKeys.SendWait("^{HOME}");   // Move to start of control
            SendKeys.SendWait("^+{END}");   // Select everything
            SendKeys.SendWait("{DEL}");     // Delete selection
            SendKeys.SendWait("Something!");

           // OR 
           // SendMessage(element.Current.NativeWindowHandle, WM_SETTEXT, 0, "Something!");
        }
    }
}

В случае использования SendMessage убедитесь, что вы добавили следующие объявления в класс:

[System.Runtime.InteropServices.DllImport("User32.dll")]
static extern int SendMessage(int hWnd, int uMsg, int wParam, string lParam);
const int WM_SETTEXT = 0x000C;

Вы можете прочитать о подходе:

0 голосов
/ 18 декабря 2018

Сначала вы должны получить ручку для второй формы, которую вы хотите открыть.Если он был ранее создан и сохранен как переменная класса, используйте его, в противном случае создайте его в этом методе и откройте его.

Чтобы вы могли заполнить текстовое поле в другой форме, вам необходимо установитьэто accessor как public или создайте для него метод общего доступа.

private void button1_Click(object sender, EventArgs e)
{
    string automationId = "Form1";
    string newTextBoxValue = "user1";
    var condition = new PropertyCondition(AutomationElement.AutomationIdProperty, automationId);
    var textBox = AutomationElement.RootElement.FindFirst(TreeScope.Subtree, condition);
    ValuePattern vPattern = (ValuePattern)textBox.GetCurrentPattern(ValuePattern.Pattern);
    vPattern.SetValue(newTextBoxValue);

    // this is the idea, not tested, adjust it to yourself
    var form2 = new SecondForm();
    form2.YourTextBox.Text = newTextBoxValue;
    form2.Show();
}
...