Метод UIAutomation ElementFromPoint () извлекает неверный элемент из Блокнота в Windows 10 - PullRequest
0 голосов
/ 29 мая 2018

Мы разрабатываем приложение Windows Forms на C # и используем автоматизацию пользовательского интерфейса для записи действий пользователя.Наше приложение объявляет о поддержке DPI как Per-monitor, поэтому система не обманывает его виртуализацией координат.

В Windows 10 мы столкнулись с проблемой Notepad : после масштабирования экрана возвращается неправильный элемент при вызове метода UIA ElementFromPoint() с правильными физическими координатами, переданными .Кроме того, координаты его BoundingRectangle, возвращаемого вызовом CurrentBoundingRectangle(), также неверны: делятся на текущее значение масштаба экрана, то есть 1,5 на 150%.

Кто-нибудь сталкивался с этой проблемой раньше и как вы ее решили?

Фон

Это касается не всех элементов пользовательского интерфейса окна «Блокнот»: только кнопка «Система» и пункты главного меню.Другие элементы, такие как основная текстовая область, скроллер, заголовок окна, диалоговые кнопки, элементы подменю, обрабатываются правильно.

Рассмотрим следующий тестовый код:

private CUIAutomation automation = new CUIAutomation();
public async Task GetElement(int x, int y)
{
    try
    {
        Debug.WriteLine($"MouseDown received: X={x} Y={y}");
        await Task.Run(() =>
        {
            // Retrieving an UIA element lying on physical coordinates
            tagPOINT point = new tagPOINT { x = x, y = y };
            IUIAutomationElement clickedElement = automation.ElementFromPoint(point);
            var elementName = clickedElement.GetCurrentPropertyValue(30005);
            var elementRect = clickedElement.CurrentBoundingRectangle;

            // Actually retrieved UIA element
            Debug.WriteLine($"UIA element: Name={elementName} " +
                $"Rect=[left={elementRect.left} top={elementRect.top} right={elementRect.right} bot={elementRect.bottom}]");
        });
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex);
    }
}

На Win 10 этот код возвращаетсяневерный элемент и BoundingRectangle для элемента главного меню «Файл»:

Получено MouseDown: X = 735 Y = 391

Элемент UIA: Имя = Приложение

Rect = [left = 475 top = 249 right = 822 bot = 268]

Просто неверный прямоугольник BoundingRectangle для кнопки System:

Получено MouseDown: X = 701 Y =282

Элемент UIA: имя = система

Rect = [слева = 453 сверху = 183 справа = 475 бот = 205]

И правильный элемент и BoundingRectangle длядругие элементы управления пользовательского интерфейса (например, Файл -> Сохранить элемент подменю):

Получено указание мыши: X = 1386 Y = 666

Элемент UIA: Имя = Сохранить

Rect= [left = 1320 top = 652 right = 1452 bot = 691]

Эти результаты не воспроизводятся в более старых версиях Блокнота, в которыхОна сама по себе поддерживает System-DPI.

Например, в Windows 7 всегда извлекаются правильные элементы и ограничивающие циклы.

Кроме того, я протестировал другие приложения на Win 10, которые реализуют Per.Монитор DPI-осведомленности в режиме: Acrobat Reader DC, Edge, Skype, Slack, Explorer.Основные меню этих приложений также обрабатываются должным образом: извлекаются правильные элементы и ограничивающие рамки.

Так что, возможно, существует проблема в реализации режима «Блок-монитор» в Notepad для Windows 10.

...