我有一个程序不是由我(封闭源代码)编写的,我需要从看起来像是多行文本编辑的地方读取文本。
该程序在最高级别有一个带有15个选项卡的TabControl。在第15个选项卡中,有我需要进入的文本编辑。
AutomationElement aeEntireApplication = AutomationElement.FromHandle(hwd);
AutomationElementCollection aeEditCollection = aeEntireApplication.FindAll(TreeScope.Descendants, new PropertyCondition(AutomationElement.ClassNameProperty,"Edit"));
foreach (AutomationElement aeEdit in aeEditCollection )
{
object patternObj;
if (edit.TryGetCurrentPattern(TextPattern.Pattern, out patternObj))
{
var textPattern = (TextPattern)patternObj;
Console.WriteLine(textPattern.DocumentRange.GetText(-1).TrimEnd('\r')); // often there is an extra '\r' hanging off the end.
}
}使用此代码,它只会打印我当前所在选项卡的文本编辑内容。有没有可能在不打开标签的情况下访问标签#15的内容?
发布于 2015-09-15 08:34:00
始终值得将Inspect SDK工具指向您的UI,并检查通过UIA Raw视图公开的内容。Raw视图包含通过UI的UIA公开的所有内容。(可以从Inspect的选项菜单中选择Inspect中显示的视图。)如果Inspect没有向您显示您感兴趣的UI,则该UI不是由应用程序(或应用程序使用的UI框架)公开的,并且您自己的UIA客户端代码也将无法访问它。
我刚刚创建了一个带有TabControl的测试WinForm应用程序。TabControl有两个选项卡,每个选项卡都有一个TextBox。Inspect显示,在任何给定时间,只有活动选项卡页面中包含的UI通过UIA公开。因此,您将无法使用UIA访问其他选项卡上的UI。
谢谢,
盖伊

发布于 2015-09-06 05:30:27
其中一个解决方案就是使用
internal static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc func, IntPtr lParam);我枚举了整个程序的所有子程序,然后在编辑旁边找到一个具有唯一名称的按钮。然后我使用
uint GW_HWNDPREV = 3;
logTextBoxHandle = GetWindow(hwnd, GW_HWNDPREV);这将使我获得我需要的文本编辑的句柄。
不是很优雅,但看起来很管用。
https://stackoverflow.com/questions/32417586
复制相似问题