我有一个WPF应用程序,在启动屏幕上有两个文本框控件。
现在我需要在这个文本框中设置一些文本。通常我会找到带有FindWindowEx
的控制窗口并调用SetWindowText
,但问题是我在这里看不到任何窗口。
即使当我打开Spy++
时,我看到的唯一窗口就是窗口本身。根本没有孩子。你能解释一下发生了什么事吗?它在WPF的其他地方工作吗?这不就是一个普通的窗口,有普通的HWND
句柄吗?如何在这些控件中设置文本?
我按照评论中的建议尝试了Snoop
,可以看到一些窗口,但不能看到启动屏幕上的控件。此外,我想从C#应用程序中自动执行此操作,而不是使用Snoop
手动执行。我已经得到了Snoop
的来源,看起来你需要将一些东西ijnect到你的应用程序中才能做到这一点。对吗?
从另一个进程为WPF控件设置文本真的那么难吗?
解决方案是使用Microsoft UI Automation
AutomationElement rootElement = AutomationElement.RootElement;
if (rootElement != null)
{
Condition condition =
new PropertyCondition(AutomationElement.NameProperty, "WindowSplash");
AutomationElement appElement =
rootElement.FindFirst(TreeScope.Children, condition);
if (appElement != null)
{
Condition condition =
new PropertyCondition(
AutomationElement.AutomationIdProperty, "element1");
AutomationElement element =
parentElement.FindFirst(TreeScope.Descendants, condition);
if (element != null)
{
ValuePattern valuePatternB =
element.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
valuePatternB.SetValue("hello automation world!");
}
}
}
我认为您可以为您的WPF窗口创建一个自定义的窗口消息(例如,标识符为1234)。之后,您可以使用来自另一个进程的PostMessage WinAPI函数将此1234消息与您想要设置的字符串一起发布到您的WPF窗口。WPF窗口将覆盖默认的消息处理过程,当遇到标识符为1234的消息时,它将使用WPF引擎类和方法设置适当的控件文本。