Я уже некоторое время работаю с сенсорным API Windows 8 (WM_POINTERDOWN / WM_POINTERUPDATE / WM_POINTERUP) на настольном сенсорном экране. Затем я попробовал свою тестовую программу на планшете с Windows 8 и обнаружил, что мое приложение не может точно определить, где пользователь касается экрана.
С другой стороны, с помощью мыши все работало нормально: я получил правильные координаты. Поскольку у меня активен режим EnableMouseInPointer(TRUE), это означает, что один и тот же код используется для обработки событий мыши и событий касания, что, по крайней мере, означает, что мой код работает корректно.
Я обнаружил, что на планшетах включен режим высокого разрешения, чтобы пользователи могли касаться того, что в противном случае было бы очень маленьким на экране. Когда я изменил DPI на планшете, чтобы удалить масштабирование, мое приложение работало нормально, когда я увеличил DPI на экране рабочего стола, все пошло не так. (И да, мое приложение поддерживает высокое разрешение)
Раздражает то, что, по-видимому, координаты, которые я получаю от сенсорного интерфейса, не совпадают в зависимости от используемого устройства:
- если пользователь использовал мышь, координаты масштабируются с учетом масштабирования с высоким разрешением.
- если пользователь использовал сенсорный экран, координаты не масштабируются и указываются в физических пикселях
Итак, что было бы правильным способом справиться с этим?
Очевидным хаком может быть проверка члена pointerType структуры POINTER_INFO и применение некоторого масштабирования в зависимости от типа (PT_TOUCH или PT_MOUSE), но, насколько я мог видеть, это нигде не задокументировано, и, например, я понятия не имею, следует ли масштабировать PT_PEN или нет.
Это не кажется очень элегантным и перспективным.
Любое предложение о том, как сделать это чисто, будет приветствоваться.