2017-03-31 58 views
1

我正在研究一個Windows 7 C++程序,它將捕獲屏幕上的文本。微軟的UIAutomation框架似乎是實現它的最好方式。除了一件事情 - 我使用框架的函數來獲取文本時,它似乎只返回了第一百萬個字符。這可能看起來很多,但嘗試列出硬盤驅動器上的每個文件,並且它很快就會達到數百萬字符的範圍。我嘗試了兩種不同的方式來獲取文本,並且兩種方式都返回相同的內容,並且都限制在第一百萬個字符。從UIAutomation呼叫返回的數據的最大長度

下面的代碼示例:

IUIAutomationElement *element = findElement(); 

VARIANT v; 
VariantInit(&v); 

element->GetCurrentPropertyValue(UIA_LegacyIAccessibleValuePropertyId, &v); 

BSTR tempString = V_BSTR(&v); 

一切都會按計劃當文本的數量少於一百萬個字符長,但在該限制任何被截斷。

我的假設,即有可能發生問題兩個地方。首先,VARIANT可能只能容納一百萬個字符,但這似乎是不正確的,這基於我所瞭解的微軟VARIANT的實現。第二個是GetCurrentPropertyValue()調用只返回多達一百萬個字符。這是相當糟糕的,因爲我沒有看到它的方式。

請注意,我也做這個使用IUIAutomationValuePattern和IUIAutomationTextRange,但它得到了相同的結果。

有什麼想法?

回答

1

插裝碼多一點之後,我意識到,我在我的有關變量的持有超過一萬字的能力斷言不正確。實際上發生的事情是,我從VARIANT中抽取的BSTR保存着所有的數據,所以它不會被截斷。真正發生的是我從BSTR創建的wstring(爲了便於字符串操作)是什麼在截斷。似乎

wstring(tempString); 

只會給我一串最多一百萬個字符。所以,雖然我沒有解決這個問題,但我已經成功地進一步縮小了罪魁禍首,至少這是一個易於處理的問題,因爲我並沒有真正丟失數據。

編輯:我是錯的wstring的處理超長字符串太能力。如果我只看wstring的長度,我會發現它正確地複製了BSTR。這是一種解脫。

是限於一萬個字的東西是Visual Studio的2015年的字符串檢查設備 - 無論何時我會看的wstring的內容,這將是超過一百萬個字符。

所以,感謝這個旅程你幫我自我發現的 - 沒有更多的看這裏。向前走。向前走。