首页 > 解决方案 > UIAutomation 属性值中的文本被截断为 4k

问题描述

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

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

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

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

TIA

标签: ui-automationmicrosoft-ui-automation

解决方案


值的说明是为了方便起见,但功能有限。相反,您必须使用TextPattern及其DocumentRange属性。这在此处明确指定。从中您可以使用该GetText(-1)方法来检索您的数据。

你可以这样编码:

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

推荐阅读