2016-06-15 18 views
8

Ana sorun: Karşılaştırma seçili metnin söz konusu metnini, buradaki Mevcut site (IE'de görüntülenir).UIA, metin seçimi ve Internet Explorer'da belge seçimi arasında çalışma noktası karşılaştırması alamıyor

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

Aralıklar geçerli ve seçili metin belge aralığının içinde. Biz hamle sayısını elde çalıştığınızda/karakterler seçilen metin belgesi/site baştan baştan, sonra biz sadece 1.

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

Ör dönüş değeri olsun. site: http://www.cplusplus.com/reference/string/string/

Düğümden "string - C++ Reference" adı verilen textpattern'i alırız. Ardından, "documentRange" belgesinin tümünün belge aralığını alırız ve fareyle bir metin seçerler ve bu aralığı selectionRange ex olarak kaydederiz. "temsil eden nesneler" (site içinden metin seçimi ... satır 3'ün altında std :: string).

Karşılaştırma noktaları nokta metinleri arasında geçerli/doğru bir mesafe döndürdüğü bir not defteri penceresi için de aynısını denedik.

Örnek: pozitif, negatif veya sıfır değer döndürülür

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

    } 
} 

cevap

2

The docs durumu. Mutlaka bir mesafe geri dönmez.

+0

Yanıtladığınız için teşekkür ederiz. Bazı programlarda bir mesafe (kelime, not defteri, ...) sağlar, bu yüzden gizli önkoşullar ne olabilir? Belgelerin herhangi bir yerinde bulamıyor. – Jaaxe

+0

@Jaaxe Sağlayıcıya bağlı. Sözleşme, olumlu, olumsuz veya sıfır olduğunu söylüyor; bazı sağlayıcılar bunun ötesine geçer ve gerçek bir mesafeye geri döner, ancak bu güvene güvenemezsiniz. –