Мы разрабатываем приложение 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.