C++ WM_指针和高DPI设置

C++ WM_指针和高DPI设置,c++,windows,touch,dpi,C++,Windows,Touch,Dpi,我在桌面触摸屏上使用Windows 8 Touch API(WM\u POINTERDOWN/WM\u POINTERUPDATE/WM\u POINTERUP)已经有一段时间了。然后,我在Windows8平板电脑上尝试了我的测试程序,发现我的应用程序无法准确检测用户触摸屏幕的位置 另一方面,使用鼠标,效果很好:我得到了正确的坐标。由于启用了EnableMouseInPointer(TRUE)模式,这意味着使用相同的代码来处理鼠标事件和触摸事件,这至少意味着我的代码在某种程度上工作正常 我发现,

我在桌面触摸屏上使用Windows 8 Touch API(WM\u POINTERDOWN/WM\u POINTERUPDATE/WM\u POINTERUP)已经有一段时间了。然后,我在Windows8平板电脑上尝试了我的测试程序,发现我的应用程序无法准确检测用户触摸屏幕的位置

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

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

恼人的是,我从触摸界面接收到的坐标显然不一样,这取决于所使用的设备:

  • 如果用户使用鼠标,则会缩放坐标以考虑高DPI缩放
  • 如果用户使用触摸屏,则坐标不会缩放,而是以物理像素为单位
那么,正确的处理方法是什么呢

一个明显的方法是检查POINTER\u INFO结构的pointerType成员,并根据类型应用一些重缩放(PT\u TOUCHPT\u MOUSE),但据我所知,在任何地方都没有记录,例如,我不知道是否应该重新调整画笔的大小

这似乎不太优雅,也不足以证明未来


欢迎就如何干净地做到这一点提出任何建议。

如果您的流程运行在不同的DPI感知级别(私有、进程间通信未虚拟化),您可以跨流程运行“SetParent”,以便DPI感知级别将从新的父级继承