Настройки WM_POINTER и High DPI

Я некоторое время работал с Windows 8 Touch API (WM_POINTERDOWN / WM_POINTERUPDATE / WM_POINTERUP) на настольном сенсорном экране. Затем я попробовал свою тестовую программу на планшете Windows 8 и обнаружил, что мое приложение не может точно определить, где пользователь касается экрана.

Использование мыши с другой стороны, работало нормально: я получил правильные координаты. Так как у меня есть EnableMouseInPointer (TRUE), активный режим означает, что один и тот же код используется для обработки событий мыши и событий касания, что по крайней мере означает, что мой код работает в некоторой степени корректно.

Что я обнаружил, так это то, что на планшетах включен режим High DPI, чтобы пользователи могли прикасаться к тому, что в противном случае было бы очень маленьким на экране. Когда я изменил DPI на планшете, чтобы убрать масштабирование, мое приложение работало нормально, когда я поднял DPI на экране рабочего стола, что-то пошло не так. (И да, мое приложение с высоким разрешением DPI)

Раздражает то, что, очевидно, координаты, которые я получаю от сенсорного интерфейса, не совпадают в зависимости от используемого устройства:

  • если пользователь использовал мышь, координаты масштабируются с учетом масштабирования с высоким разрешением.
  • если пользователь использовал сенсорный экран, координаты не масштабируются и отображаются в физических пикселях

Итак, что будет правильным способом справиться с этим?

Очевидным хаком было бы проверить pointerType член POINTER_INFO struct, и примените некоторое изменение в зависимости от типа (PT_TOUCH или же PT_MOUSE), но, насколько я мог видеть, это нигде не задокументировано, и, например, я понятия не имею, если PT_PEN следует изменить или нет.

Это не кажется очень элегантным и перспективным.

Любое предложение о том, как сделать это чисто, будет приветствоваться.

3

Решение

Если у вас есть процессы, работающие на разных уровнях осведомленности DPI (частные, межпроцессные взаимодействия не виртуализированы), вы можете запустить «SetParent» для всех процессов, чтобы уровень осведомленности DPI был унаследован от нового родителя. http://msdn.microsoft.com/en-us/library/windows/desktop/dn469266(v=vs.85).aspx#input_issues

0

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

Других решений пока нет …

По вопросам рекламы [email protected]