UIA 无法获得比较端点以在 Internet Explorer 中的文本选择和文档范围之间工作

UIA can't get compareendpoints to work between text selection and documentrange in internet explorer

主要问题: 将 selected 文本的文本范围与当前站点上的文档范围(在 IE 中显示)进行比较时,无法让 CompareEndpoints 给出“1”以外的任何值。

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

范围有效,select编辑的文本在文档范围内。当我们尝试获取 moves/characters 的数量时,selected 文本是从 document/site-start 开始的,那么我们只能得到 return 值 1.

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

例如。网站: http://www.cplusplus.com/reference/string/string/

我们从名称为 "string - C++ Reference" 的节点中检索文本模式。然后我们用鼠标获取整个文档的文档范围 "documentRange" 和一些文本 select 并将该范围保存到 selectionRange ex。 "objects that represent"(select 来自站点的文本......std::string 下的第 3 行)。

我们对记事本 window 进行了相同的尝试,其中比较端点 return 编辑了点文本范围之间的 valid/correct 距离。

示例:

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

    }
}

The docs 声明负值、正值或零值是 returned。它不一定return距离。