Текстовый шаблон C UIA не найден в элементе управления RichEdit в Win 7, но C # UIA находит его

#c# #visual-c #ui-automation #microsoft-ui-automation

#c# #visual-c #автоматизация пользовательского интерфейса #microsoft-ui-автоматизация

Вопрос:

В Win 7 SP1 с обновлением Convenience (последняя версия Win 7, которая была отправлена), мой код на C , использующий CUIAutomation Windows Automation 3.0, не может получить текстовый шаблон из элемента управления RichEdit во встроенном приложении WordPad. Однако эквивалентный код C #, использующий UIAutomationClient и UIAutomationTypes может.

Больший успех в Win 10: как код C , так и код C # успешно получают текстовый шаблон.

У моего основного проекта проблемы с совместимостью с другим приложением C # UIA, которые исчезли, когда я использую код C в Win 10. Поэтому я действительно хочу использовать код C и в Win 7. Кто-нибудь знает, почему код C терпит неудачу и как это исправить? Я очень удивлен, что получение простого текстового шаблона из встроенного элемента управления RichEdit работает ненадежно!

Вот код C # (гораздо легче читать!), За которым следует код C :

 using System;
using System.Threading;
using System.Windows.Automation;

namespace UIAutomationNET
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Getting element at cursor in 3 seconds...");
            Thread.Sleep(3000);

            var element = AutomationElement.FocusedElement;

            if (element != null)
            {
                var textPatternElement = element.FindFirst(
                    TreeScope.Subtree,
                    new PropertyCondition(AutomationElement.IsTextPatternAvailableProperty, true));

                if (textPatternElement == null)
                    Console.WriteLine("No element supporting TextPattern found.");
                else
                    Console.WriteLine("TextPattern is supported!  :-)");
            }
        }
    }
}
 

Следующий код C основан на этом примере галереи кода MSDN:

 #include <windows.h>
#include <ole2.h>
#include <uiautomation.h>
#include <strsafe.h>

IUIAutomation *_automation;


int _cdecl wmain(_In_ int argc, _In_reads_(argc) WCHAR* argv[])
{
    UNREFERENCED_PARAMETER(argc);
    UNREFERENCED_PARAMETER(argv);

    // Initialize COM before using UI Automation
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        wprintf(L"CoInitialize failed, HR:0xxn", hr);
    }
    else
    {
        // Use CUIAutomation instead of CUIAutomation8 on Win 7
        hr = CoCreateInstance(__uuidof(CUIAutomation), NULL,
            CLSCTX_INPROC_SERVER, IID_PPV_ARGS(amp;_automation));
        if (FAILED(hr))
        {
            wprintf(L"Failed to create a CUIAutomation, HR: 0xxn", hr);
        }
        else
        {
            IUIAutomationElement *element = NULL;
            wprintf( L"Getting element at cursor in 3 seconds...n" );
            Sleep(3000);

            POINT pt;
            GetCursorPos(amp;pt);
            hr = _automation->ElementFromPoint(pt, amp;element);
            if (FAILED(hr))
            {
                wprintf( L"Failed to ElementFromPoint, HR: 0xxnn", hr );
            }

            if (SUCCEEDED(hr) amp;amp; element != NULL)
            {
                IUIAutomationElement *textElement = NULL;

                // Create a condition that will be true for anything that supports Text Pattern
                // Use UIA_IsTextPatternAvailablePropertyId instead of UIA_IsTextPattern2AvailablePropertyId on Win 7
                IUIAutomationCondition* textPatternCondition;
                VARIANT trueVar;
                trueVar.vt = VT_BOOL;
                trueVar.boolVal = VARIANT_TRUE;
                hr = _automation->CreatePropertyCondition(UIA_IsTextPatternAvailablePropertyId, trueVar, amp;textPatternCondition);

                if (FAILED(hr))
                {
                    wprintf(L"Failed to CreatePropertyCondition, HR: 0xxn", hr);
                }
                else
                {
                    // Actually do the search
                    hr = element->FindFirst(TreeScope_Subtree, textPatternCondition, amp;textElement);
                    if (FAILED(hr))
                    {
                        wprintf(L"FindFirst failed, HR: 0xxn", hr);
                    }
                    else if (textElement == NULL)
                    {
                        wprintf(L"No element supporting TextPattern found.n");
                        hr = E_FAIL;
                    }
                    else
                    {
                        wprintf(L"TextPattern is supported!  :-)n");
                    }
                    textPatternCondition->Release();
                }
            }
            _automation->Release();
        }
        CoUninitialize();
    }

    return 0;
}

 

Ответ №1:

Если я правильно помню, собственный поставщик автоматизации пользовательского интерфейса Win7 не поддерживал TextPattern, в то время как поставщик автоматизации управляемого пользовательского интерфейса поддерживал.

Поставщик native UI Automation не добавлял поддержку TextPattern до Windows 8.

Комментарии:

1. Да, в Win 7 поддержка текстового шаблона RichEdit была только у поставщика на стороне управляемого клиента. Это вызвало много проблем.