2016-06-15 5 views
8

erhalten Hauptproblem: CompareEndpoints können keinen anderen Wert als "1" erhalten, wenn der Textbereich des ausgewählten Textes mit dem Dokumentbereich auf der Seite verglichen wird aktuelle Seite (angezeigt in IE).UIA kann keine Vergleichspunkte zwischen Textauswahl und Dokumentbereich im Internet Explorer

//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); 

Die Bereiche sind gültig und der ausgewählte Text befindet sich innerhalb des Dokumentbereichs. Wenn wir versuchen, die Anzahl der Züge zu bekommen/Zeichen der ausgewählte Text aus dem Anfang des Dokuments/site-Start ist, dann nur wir Rückgabewert von 1.

selectionRange->CompareEndpoints(
    TextPatternRangeEndpoint::TextPatternRangeEndpoint_Start, 
    documentRange, 
    TextPatternRangeEndpoint::TextPatternRangeEndpoint_Start, 
    &rv); 

Ex bekommen. die Seite: http://www.cplusplus.com/reference/string/string/

Wir rufen das Textmuster vom Knoten mit dem Namen "String - C++ Reference" ab. Dann erhalten wir den Dokumentbereich des gesamten Dokuments "documentRange" und wählen einen Text mit der Maus aus und speichern diesen Bereich auf selectionRange ex. "Objekte, die darstellen" (Auswahl von Text aus der Site ... Zeile 3 unter std :: string).

Wir haben das selbe für ein Notizblockfenster versucht, wo compareendpoints einen gültigen/richtigen Abstand zwischen den Punkten textranges zurückgaben.

Beispiel:

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

    } 
} 

Antwort

2

The docs Zustand, dass ein negativer, positiver oder Null-Wert zurückgeführt wird. Es wird nicht unbedingt eine Entfernung zurückgegeben.

+0

Vielen Dank für Ihre Antwort. In einigen Programmen bietet es eine Distanz (Wort, Notizblock, ...), also was könnten die versteckten Voraussetzungen sein? Das kann nirgendwo in der Dokumentation gefunden werden. – Jaaxe

+0

@Jaaxe Es kommt auf den Anbieter an. Der Vertrag sagt, dass es positiv, negativ oder null ist; Einige Anbieter gehen darüber hinaus und geben eine tatsächliche Entfernung zurück, aber Sie können sich nicht darauf verlassen. –