WM_POINTER и настройки высокого разрешения

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

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

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

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

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

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

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

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

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


person Mickaël Pointier    schedule 07.06.2013    source источник


Ответы (1)


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

person ChileAddict - Intel    schedule 15.04.2014