Главная проблема:
Невозможно получить CompareEndpoints, чтобы дать какое-либо значение, кроме «1», при сравнении текстовой области выделенного текста с документной строкой на текущем сайте (отображается в IE).
//Initialize range variables
IUIAutomationTextRange* documentRange = NULL;
IUIAutomationTextRange* selectionRange = NULL;
IUIAutomationTextRangeArray* selectionRangeArray = NULL;
//Get entire text document range
m_pTextPattern->get_DocumentRange(&documentRange);
//Get selection range
m_pTextPattern->GetSelection(&selectionRangeArray);
selectionRangeArray->GetElement(0, &selectionRange);
Диапазоны действительны, а выделенный текст находится внутри диапазона документа. Когда мы пытаемся получить количество ходов / символов, выделенный текст с начала документа / начала сайта, мы получаем только возвращаемое значение 1.
selectionRange->CompareEndpoints(
TextPatternRangeEndpoint::TextPatternRangeEndpoint_Start,
documentRange,
TextPatternRangeEndpoint::TextPatternRangeEndpoint_Start,
&rv);
Ex. сайт:
http://www.cplusplus.com/reference/string/string/
Мы извлекаем текстовый шаблон из узла с именем «string — C ++ Reference». Затем мы получаем диапазон документов всего документа «documentRange», выделяем мышкой некоторый текст и сохраняем этот диапазон в selectionRange ex. «объекты, которые представляют» (выделение текста с сайта … строка 3 под std :: string).
Мы пробовали то же самое для окна блокнота, где compareendpoints возвращали правильное / правильное расстояние между точками textranges.
Пример:
if (SUCCEEDED(hr))
{
IUIAutomationTextRange* documentRange = NULL;
IUIAutomationTextRangeArray* selectionRangeArray = NULL;
IUIAutomationTextRange* selectionRange = NULL;
hr = E_FAIL;
hr = m_pTextPattern->get_DocumentRange(&documentRange);
if (SUCCEEDED(hr) && documentRange != NULL)
{
hr = m_pTextPattern->GetSelection(&selectionRangeArray);
if (SUCCEEDED(hr) && selectionRangeArray != NULL)
{
int length;
hr = selectionRangeArray->get_Length(&length);
if (SUCCEEDED(hr) && length > 0)
{
hr = selectionRangeArray->GetElement(0, &selectionRange);
if (SUCCEEDED(hr) && selectionRange != NULL)
{
hr = selectionRange->CompareEndpoints(TextPatternRangeEndpoint::TextPatternRangeEndpoint_Start,
documentRange, TextPatternRangeEndpoint::TextPatternRangeEndpoint_Start, &rv);
wprintf(L"getSelectionStart rv: %d\n", rv);
}
}
}
}
if (documentRange != NULL)
{
documentRange->Release();
documentRange = NULL;
}
if (selectionRangeArray != NULL)
{
selectionRangeArray->Release();
selectionRangeArray = NULL;
}
if (selectionRange != NULL)
{
selectionRange->Release();
selectionRange = NULL;
}
}
}
Документы утверждают, что возвращается отрицательное, положительное или нулевое значение. Это не возвращает расстояние обязательно.
Других решений пока нет …