为了账号安全,请及时绑定邮箱和手机立即绑定

UI 自动化 - 为另一个应用程序的 TextBox 设置文本

UI 自动化 - 为另一个应用程序的 TextBox 设置文本

C#
慕桂英4014372 2022-06-18 16:34:28
我有两种形式。当单击其中一个按钮时,我想打开另一个按钮并在其中填充一个文本框。我尝试使用下面的代码,但它给出了一个错误,上面写着“不支持的模式”。这是我的代码: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 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

您应该首先检查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;


查看完整回答
反对 回复 2022-06-18
?
SMILET

TA贡献1796条经验 获得超4个赞

首先,您应该获得要打开的第二个表单的句柄。如果它先前已创建并存储为类变量,则使用它,否则在此方法中创建并打开它。


为了让您能够在另一个表单中填充文本框,您需要将其访问器设置为公共,或为其创建公共设置器方法。


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();

}


查看完整回答
反对 回复 2022-06-18
  • 2 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信