我已经在桌面触摸屏上使用Windows 8 Touch API( WM_POINTERDOWN / WM_POINTERUPDATE / WM_POINTERUP )已有一段时间。然后,我在Windows 8平板电脑上尝试了我的测试程序,发现我的应用程序无法准确检测用户触摸屏幕的位置。
另一方面,使用鼠标可以正常工作:我得到了正确的坐标。由于我启用了EnableMouseInPointer(TRUE)模式,因此这意味着使用相同的代码来处理鼠标事件和触摸事件,这至少意味着我的代码在某种程度上可以正常工作。
我发现,平板电脑启用了高DPI模式,使用户可以触摸屏幕上很小的东西。当我在平板电脑上更改DPI以消除缩放比例时,我的应用程序运行正常,当我在桌面屏幕上提升DPI时,出现了问题。 (是的,我的应用程序是高DPI感知的)
令人讨厌的事情是,显然我从触摸界面接收到的坐标取决于所使用的设备:
那么,处理该问题的正确方法是什么?
一个明显的破解方法是检查 POINTER_INFO 结构的pointerType成员,并根据类型( PT_TOUCH 或 PT_MOUSE )应用一些重新缩放,但据我所知,在任何地方都没有记录例如,我不知道是否应重新缩放 PT_PEN 。
这似乎不是很优雅,也不适合 future 。
任何有关如何做到这一点的建议都将受到欢迎。
最佳答案
如果您有运行在不同DPI感知级别(未虚拟化,进程间通信未虚拟化)的进程,则可以跨进程运行“SetParent”,以便DPI感知级别将从新的父级继承。 http://msdn.microsoft.com/en-us/library/windows/desktop/dn469266(v=vs.85).aspx#input_issues
关于c++ - WM_POINTER和高DPI设置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16980232/