ui-automation - 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
解决方案
值的说明是为了方便起见,但功能有限。相反,您必须使用TextPattern及其DocumentRange属性。这在此处明确指定。从中您可以使用该GetText(-1)
方法来检索您的数据。
你可以这样编码:
string GetText(AutomationElement ae)
{
return (ae.GetCurrentPattern(TextPattern.Pattern) as TextPattern)?.DocumentRange.GetText(-1);
}
推荐阅读
- c# - C# Oakton 标志与参数
- sparql - 如何使用 sparql 递归查询?
- c# - 围绕 IEnumerable 和 IEnumerator
- docker - 具有未来开始日期的 Docker Swarm 管理器证书:验证根 CA 证书时出错:x509:证书已过期或尚未生效
- amazon-web-services - AWS AMI Bitnami + Webmin 无法通过 https://publicip:10000 访问
- php - 在 PHP 中获取 SQL 命令的 ID
- linux - awk 脚本的匹配模式
- php - 在这种情况下,哪种清除数组的方法更好?
- ios - 终止应用程序未捕获的异常“NSInvalidArgumentException”
- google-cloud-dataflow - 如何从 DoFn 输出单个值并将其用作另一个 DoFn 中的参数?