设置WPF应用程序的控制文本

时间:2014-04-19 00:12:06

标签: c# wpf windows winapi findwindowex

我有一个WPF应用程序,在启动画面上有两个文本框控件。

现在我需要在这个文本框中设置一些文本。通常我会找到FindWindowEx的控制窗口并调用SetWindowText,但问题是我在这里看不到任何窗口。

即使我打开Spy++,我看到的唯一窗口就是窗口本身。根本没有孩子。 你能解释一下发生了什么吗?它在WPF的其他地方有用吗?它不只是一个普通HWND句柄的普通窗口吗?如何在这些控件中设置文本?

我按照评论中的建议尝试Snoop,我能够看到一些窗口,但不能看到启动画面上的控件。此外,我想从C#应用程序自动执行此操作,而不是手动使用Snoop。我有Snoop的来源,看起来你需要在你的应用程序中找到一些东西才能做到这一点。是不是?

从另一个进程为WPF控件设置文本真的很难吗?

2 个答案:

答案 0 :(得分:0)

我认为您可以为WPF窗口制作自定义Windows消息(例如,标识符1234)。之后,您可以使用其他进程的PostMessage WinAPI函数将此1234消息发布到您要设置的字符串的WPF窗口。 WPF窗口将覆盖默认消息处理过程,当遇到带有标识符1234的消息时,它将使用WPF引擎类和方法设置适当的控件文本。

答案 1 :(得分:0)

解决方案是使用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!");
        }
    }
}