来自 UIAutomation 属性 值的文本被截断为 4k
Text from UIAutomation property value truncated to 4k
我在 Windows 7 上使用 32 位 C++ 应用程序的 UIAutomation 来获取其他进程 windows 的文本内容。我注意到如果 windows 中的文本比这长,API 总是 returns 字符串被截断为恰好 4096 个字符。对于 UIA_ValueValuePropertyId 和 UIA_LegacyIAccessibleValuePropertyId 属性 ID,GetCachedPropertyValue() 和 GetCurrentPropertyValue() 调用都会发生这种情况。
除其他外,针对 32 位和 64 位记事本进行了测试。
当我使用 SendMessage 和 WM_GETTEXTLENGTH 和 WM_GETTEXT 消息检索文本时,完整的、未截断的文本被 returned。 (我目前将其用作解决方法。)
翻阅文档,我找不到任何提及此限制或如何绕过它的地方,如果截断是设计使然的话,我希望如此。
我在 Whosebug 上发现了一个 similar question,但截断显然是由于 Visual Studio 调试器,而不是 UIAutomation API。但是,这个问题清楚地表明 UIAutomation 应该能够 return 非常长的文本。
谷歌搜索这个问题导致 another question on Whosebug 也提到了 4096 个字符的限制,但不幸的是这个问题和任何可能的答案都被删除了。
也许 UIA_ValueValuePropertyId 或 UIA_LegacyIAccessibleValuePropertyId 属性不适合使用,但我未能找到更好的属性。
任何人都可以指出我做错了什么,或者对我可以尝试什么提出建议吗?也欢迎指出我明显遗漏的文档。
TIA
此处对值的说明是为了方便,但功能有限。相反,您必须使用 TextPattern and it's DocumentRange property. This is explicitly specified here。
您可以从中使用 GetText(-1)
方法检索您的数据。
你可以这样编码:
string GetText(AutomationElement ae)
{
return (ae.GetCurrentPattern(TextPattern.Pattern) as TextPattern)?.DocumentRange.GetText(-1);
}
我在 Windows 7 上使用 32 位 C++ 应用程序的 UIAutomation 来获取其他进程 windows 的文本内容。我注意到如果 windows 中的文本比这长,API 总是 returns 字符串被截断为恰好 4096 个字符。对于 UIA_ValueValuePropertyId 和 UIA_LegacyIAccessibleValuePropertyId 属性 ID,GetCachedPropertyValue() 和 GetCurrentPropertyValue() 调用都会发生这种情况。 除其他外,针对 32 位和 64 位记事本进行了测试。 当我使用 SendMessage 和 WM_GETTEXTLENGTH 和 WM_GETTEXT 消息检索文本时,完整的、未截断的文本被 returned。 (我目前将其用作解决方法。)
翻阅文档,我找不到任何提及此限制或如何绕过它的地方,如果截断是设计使然的话,我希望如此。 我在 Whosebug 上发现了一个 similar question,但截断显然是由于 Visual Studio 调试器,而不是 UIAutomation API。但是,这个问题清楚地表明 UIAutomation 应该能够 return 非常长的文本。 谷歌搜索这个问题导致 another question on Whosebug 也提到了 4096 个字符的限制,但不幸的是这个问题和任何可能的答案都被删除了。
也许 UIA_ValueValuePropertyId 或 UIA_LegacyIAccessibleValuePropertyId 属性不适合使用,但我未能找到更好的属性。
任何人都可以指出我做错了什么,或者对我可以尝试什么提出建议吗?也欢迎指出我明显遗漏的文档。
TIA
此处对值的说明是为了方便,但功能有限。相反,您必须使用 TextPattern and it's DocumentRange property. This is explicitly specified here。
您可以从中使用 GetText(-1)
方法检索您的数据。
你可以这样编码:
string GetText(AutomationElement ae)
{
return (ae.GetCurrentPattern(TextPattern.Pattern) as TextPattern)?.DocumentRange.GetText(-1);
}