Масштабирование с высоким разрешением, ловушки мыши и WindowFromPoint

У меня есть процесс, который устанавливает SetWindowsHookEx (WH_MOUSE_LL,,,) щелчок правой кнопкой мыши. Мой процесс настроен на поддержку системы DPI в Windows 10.0.10586 с масштабированием 150% на обоих мониторах. Это было установлено путем вызова SetProcessDpiAwareness (PROCESS_SYSTEM_DPI_AWARE).

Мой проблемный сценарий, например Office 2007 не поддерживает DPI, поэтому давайте разместим MS Word в правой части экрана. Щелкните правой кнопкой мыши прямо над панелью задач в нижнем правом углу, и крюк мыши отправит координаты 1279, 675 — масштабируется в Word. Затем я щелкаю правой кнопкой мыши на визуальной студии (с поддержкой DPI), почти три четверти экрана, и крюк мыши отправляет мне координаты, например, 1279, 1008 от Visual Studio. Поэтому, если бы я щелкнул вверх по экрану, я мог бы получить те же 1279, 675.

Мой процесс пытается определить, какое окно находится в точке, вызывая API WindowFromPoint, но в этом сценарии это явно не получится, поскольку два приложения «совместно используют» одну точку.

Можно ли заставить крючок мыши всегда отправлять необработанные физические координаты вместо масштабированных в приложение, не поддерживающее DPI? и если да, то как? Альтернативно, есть какой-то другой способ определения hWnd или processID из ловушек мыши?

-2

Решение

Microsoft исправила это в 10.0.14393.

Теперь у вас не должно быть ничего в сети вашего клиента с меньшим номером сборки, если только они не находятся на LTSB 10.0.10240.

Это решение: Снимок экрана с поддержкой DPI

0

Другие решения

Поскольку процесс поддерживает DPI, вызов GetCursorPos () в обработчике обратного вызова ловушки мыши всегда выбирает необработанные физические координаты, а не логические координаты, масштабированные до приложения. Просто отбросьте координаты, переданные обратному вызову мыши.

Добавлено 30.09.2016

Ничего не стоит, хотя GetMessagePos кажется вероятным, а кандидат возвращает правильные координаты, только если процесс не виртуализирован с разрешением dpi.

например

VOID MessagePump()
{
MSG     messageGet = { 0 };
DWORD   dwPos;
POINTS  p;

while (GetMessage(&messageGet,NULL,0,0))
{
dwPos = GetMessagePos();
p = MAKEPOINTS( dwPos );
TranslateMessage( &messageGet );
DispatchMessage( &messageGet );
}
}

Обработчик обратного вызова Mouse вызывается во время вызова GetMessage (), но это не приводит к получению правильных физических координат, где виртуализация DPI активна для процесса. например физический x = 1909, y = 1072 возвращается как 1091, 612 с масштабированием 175%, что, хотя и является арифметически правильным, не то, что требовалось.

-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector