首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UI自动化FindAll(TreeScope.Descendants)不适用于子代

UI自动化FindAll(TreeScope.Descendants)不适用于子代
EN

Stack Overflow用户
提问于 2015-09-06 04:55:04
回答 2查看 1.1K关注 0票数 1

我有一个程序不是由我(封闭源代码)编写的,我需要从看起来像是多行文本编辑的地方读取文本。

该程序在最高级别有一个带有15个选项卡的TabControl。在第15个选项卡中,有我需要进入的文本编辑。

代码语言:javascript
复制
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的内容?

EN

回答 2

Stack Overflow用户

发布于 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。

谢谢,

盖伊

票数 1
EN

Stack Overflow用户

发布于 2015-09-06 05:30:27

其中一个解决方案就是使用

代码语言:javascript
复制
internal static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc func, IntPtr lParam);

我枚举了整个程序的所有子程序,然后在编辑旁边找到一个具有唯一名称的按钮。然后我使用

代码语言:javascript
复制
uint GW_HWNDPREV = 3;
logTextBoxHandle = GetWindow(hwnd, GW_HWNDPREV);

这将使我获得我需要的文本编辑的句柄。

不是很优雅,但看起来很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32417586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档