从UIAutomation电话

时间:2017-03-31 16:03:11

标签: c++ ui-automation

我正在使用Windows 7 C ++程序来捕获屏幕上的文本。微软的UIAutomation框架似乎是实现这一目标的最佳方式。除了一件事 - 当我使用框架的函数来获取文本时,它似乎只返回了前一百万个字符。这可能看起来很多,但尝试列出硬盘上的每个文件,并且它很快会在数百万字符范围内上升。我已经尝试了两种不同的方法来获取该文本,并且两种方式都返回相同的内容,并且两者都限制在前一百万个字符中。

以下是代码示例:

IUIAutomationElement *element = findElement();

VARIANT v;
VariantInit(&v);

element->GetCurrentPropertyValue(UIA_LegacyIAccessibleValuePropertyId, &v);

BSTR tempString = V_BSTR(&v);

当文本数量少于一百万个字符时,一切都按预期工作,但超过该限制的任何内容都会被截断。

我假设可能有两个地方出现问题。首先,VARIANT可能只能容纳一百万个字符,但这似乎是不正确的,基于我可以找到的关于Microsoft的VARIANT实现的内容。第二个是GetCurrentPropertyValue()调用只返回一百万个字符。这是相当糟糕的,因为我没有看到解决方法。

请注意,我也是使用IUIAutomationValuePattern和IUIAutomationTextRange完成此操作,但它会产生相同的结果。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在对代码进行检测之后,我已经意识到我对VARIANT能够容纳超过一百万个字符的断言不正确。实际发生的是我从VARIANT拉出的BSTR持有所有数据,所以它根本没有截断。真正发生的是我从BSTR创建的wstring(为了便于字符串操作)正在进行截断。似乎好像

wstring(tempString);

只会给我一个最多一百万个字符的字符串。所以,虽然我还没有解决问题,但我已经成功地缩小了罪魁祸首,至少它是一个易处理的问题,因为我实际上并没有丢失数据。

编辑:我对wstring处理超长字符串的能力也不错。如果我只看一下wstring的长度,我发现它正确地复制了BSTR。这是一种解脱。

限制为一百万个字符的东西是Visual Studio 2015的字符串检查工具 - 无论何时我查看wstring的内容,它都不会超过一百万个字符。 / p>

所以,感谢你自我发现的旅程,你帮助了我 - 没有什么可以看到的。向前走。继续前进。