2016-06-15 58 views
8

Problema principale: Impossibile ottenere punti di confronto per fornire un valore diverso da "1" quando si confronta il textrange del testo selezionato con il documentar sito corrente (visualizzato in IE).UIA non può ottenere punti di confronto per lavorare tra la selezione del testo e documentrange in 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); 

Gli intervalli sono validi e il testo selezionato si trova all'interno dell'intervallo del documento. Quando cerchiamo di ottenere il numero di mosse/caratteri del testo selezionato è dall'inizio del documento/sito-start, quindi abbiamo solo valore di ritorno 1.

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

Ex. il sito: http://www.cplusplus.com/reference/string/string/

Si recupera il textpattern dal nodo con il nome "stringa - Riferimento C++". Quindi otteniamo la gamma di documenti dell'intero documento "documentRange" e selezioniamo del testo con il mouse e salviamo tale intervallo in selectionRange ex. "oggetti che rappresentano" (selezione del testo dal sito ... riga 3 sotto std :: string).

Abbiamo provato lo stesso per una finestra del blocco note, in cui i punti di confronto hanno restituito una distanza valida/corretta tra i punti textrang.

Esempio:

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

    } 
} 

risposta

2

The docs stato che un positivo o valore negativo, zero viene restituito. Non restituisce necessariamente una distanza.

+0

Grazie per la risposta. In alcuni programmi fornisce una distanza (parola, blocco note, ...), quindi quali potrebbero essere i prerequisiti nascosti? Non riesco a trovarlo da nessuna parte nella documentazione. – Jaaxe

+0

@Jaaxe Dipende dal provider. Il contratto dice che è positivo, negativo o zero; alcuni provider vanno oltre e restituiscono una distanza effettiva, ma non si può fare affidamento su questo. –