2016-06-15 40 views
8

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; 
     } 

    } 
} 

Odpowiedz

2

The docs stwierdzić, że ujemny, dodatni lub zerowy wartość jest zwracana. Nie zwraca koniecznie dystansu.

+0

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

+0

@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ć. –

Powiązane problemy