2 回答
TA贡献1856条经验 获得超5个赞
您应该首先检查ValuePattern
模式的可用性:
如果
ValuePattern
模式可用,请使用其SetValue
方法。否则使用以下解决方案之一:
将焦点设置在控件上,并用于
SendKeys
清除和设置文本。或使用
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;
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();
}
- 2 回答
- 0 关注
- 131 浏览
添加回答
举报