WM_POINTER和高DPI设置

时间:2013-06-07 09:04:33

标签: c++ windows touch dpi

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

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

我发现,平板电脑启用了高DPI模式,使用户可以触摸屏幕上非常小的内容。当我更改平板电脑上的DPI以删除缩放时,我的应用程序工作正常,当我在桌面屏幕上加载DPI时出错了。 (是的,我的应用程序是高DPI意识)

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

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

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

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

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

欢迎任何有关如何干净利落的建议。

1 个答案:

答案 0 :(得分:0)

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