Główny problem: Nie można uzyskać wartości porównawczych, aby podać wartość inną niż "1" podczas porównywania zakresu tekstowego zaznaczonego tekstu z zakresem dokumentów na stronie aktualna strona (wyświetlana w IE).UIA nie może porównywać punktów do pracy pomiędzy wyborem tekstu a zakresem dokumentów w eksploratorze internetowym
//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);
Zakresy są prawidłowe, a zaznaczony tekst znajduje się w zakresie dokumentu. Kiedy staramy się uzyskać liczbę ruchów/znaków zaznaczony tekst jest od początku dokumentu/site-start, a potem tylko otrzymamy wartość zwracaną 1.
selectionRange->CompareEndpoints(
TextPatternRangeEndpoint::TextPatternRangeEndpoint_Start,
documentRange,
TextPatternRangeEndpoint::TextPatternRangeEndpoint_Start,
&rv);
Ex. strona: http://www.cplusplus.com/reference/string/string/
Pobieramy wzór tekstowy z węzła o nazwie "string - C++ Reference". Następnie otrzymujemy zakres dokumentów całego dokumentu "documentRange" i zaznaczamy tekst za pomocą myszy i zapisujemy ten zakres do selectionRange ex. "obiekty reprezentujące" (wybór tekstu z serwisu ... wiersz 3 pod std :: string).
Próbowaliśmy tego samego dla okna notatnika, gdzie punkty porównania zwróciły prawidłową/poprawną odległość między punktami tekstowymi.
przykład:
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;
}
}
}
Dziękuję za odpowiedź. W niektórych programach zapewnia dystans (słowo, notatnik, ...), więc jakie mogą być ukryte wymagania wstępne? Nie można tego znaleźć w dokumentacji. – Jaaxe
@Jaaxe To zależy od dostawcy. Umowa mówi, że jest dodatnia, ujemna lub zero; niektórzy dostawcy wykraczają poza to i zwracają rzeczywistą odległość, ale nie można na tym polegać. –