【问题标题】:Text from UIAutomation property value truncated to 4kUIAutomation 属性值中的文本被截断为 4k
【发布时间】:2020-02-02 19:13:58
【问题描述】:

我在 Windows 7 上使用 32 位 C++ 应用程序中的 UIAutomation 来获取其他进程窗口的文本内容。我注意到如果窗口中的文本比这长,API 总是返回截断为 4096 个字符的字符串。对于 UIA_ValueValuePropertyId 和 UIA_LegacyIAccessibleValuePropertyId 属性 ID,GetCachedPropertyValue() 和 GetCurrentPropertyValue() 调用都会发生这种情况。 除其他外,针对 32 位和 64 位记事本进行了测试。 当我使用 SendMessage 以及 WM_GETTEXTLENGTH 和 WM_GETTEXT 消息检索文本时,将返回完整的、未截断的文本。 (这是我目前使用的一种解决方法。)

查看文档,我找不到任何提及此限制或如何解决它的信息,如果截断是设计使然的话,我会预料到这一点。 我在 stackoverflow 上找到了similar question,但截断显然是由于 Visual Studio 调试器,而不是 UIAutomation API。但是,这个问题清楚地表明 UIAutomation 应该能够返回很长的文本。 谷歌搜索该问题会导致在 stackoverflow 上的 another question 也提到了 4096 个字符的限制,但不幸的是,该问题和任何可能的答案都被删除了。

也许属性 UIA_ValueValuePropertyId 或 UIA_LegacyIAccessibleValuePropertyId 不是正确使用的属性,但我没有找到更好的属性。

谁能指出我做错了什么,或者有什么我可以尝试的建议?也欢迎指出我显然错过的文档。

TIA

【问题讨论】:

    标签: ui-automation microsoft-ui-automation


    【解决方案1】:

    这里的值说明是为了方便,但功能有限。相反,您必须使用 TextPattern 并且它是 DocumentRange 属性。这是明确指定的here。 您可以从中使用GetText(-1) 方法检索您的数据。

    你可以这样编码:

    string GetText(AutomationElement ae)
    {
        return (ae.GetCurrentPattern(TextPattern.Pattern) as TextPattern)?.DocumentRange.GetText(-1);
    }   
    

    【讨论】:

    • 感谢您的回答和对文档的参考。我要试试这个。它没有解释为什么 in this case 返回了超过一百万个字符 - 但当然,如果没有指定限制,任何事情都可能发生。
    • 工作正常,谢谢。不过,对于那些不实现 TextPattern 接口的应用程序(例如记事本),仍然需要解决方法...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多