3

我已经在桌面触摸屏上使用 Windows 8 Touch API ( WM_POINTERDOWN / WM_POINTERUPDATE / WM_POINTERUP ) 工作了一段时间。然后我在 Windows 8 平板电脑上尝试了我的测试程序,发现我的应用程序无法准确检测到用户触摸屏幕的位置。

另一方面,使用鼠标效果很好:我得到了正确的坐标。由于我启用了EnableMouseInPointer(TRUE)模式,这意味着相同的代码正在用于处理鼠标事件和触摸事件,这至少意味着我的代码在某种程度上可以正常工作。

我发现,平板电脑启用了高 DPI 模式,使用户可以触摸屏幕上本来很小的东西。当我更改平板电脑上的 DPI 以消除缩放时,我的应用程序运行良好,当我提高桌面屏幕上的 DPI 时,事情就出错了。(是的,我的应用程序是高 DPI 感知的)

令人讨厌的是,显然我从触摸界面收到的坐标因使用的设备而异:

  • 如果用户使用鼠标,则坐标会被缩放以考虑到高 DPI 缩放。
  • 如果用户使用触摸屏,则坐标不会缩放并且以物理像素为单位

那么,处理这个问题的正确方法是什么?

一个明显的技巧是检查POINTER_INFO结构的pointerType成员,并根据类型(PT_TOUCHPT_MOUSE)应用一些重新缩放,但据我所知,它没有记录在任何地方,例如我不知道是否是否应该重新调整PT_PEN 。

这似乎不是很优雅和未来的证明。

任何关于如何干净地做到这一点的建议都将受到欢迎。

4

1 回答 1

0

如果您有运行在不同 DPI 感知级别的进程(私有、进程间通信未虚拟化),您可以跨进程运行“SetParent”,以便从新父级继承 DPI 感知级别。http://msdn.microsoft.com/en-us/library/windows/desktop/dn469266(v=vs.85).aspx#input_issues

于 2014-04-15T18:21:37.143 回答