#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 была только у поставщика на стороне управляемого клиента. Это вызвало много проблем.