在Windows中准确响应平板/鼠标事件

0 投票
1 回答
1171 浏览
提问于 2025-04-15 14:40

我该如何告诉Windows不要对平板笔事件进行无用的预处理呢?

我正在用Python 2.6编程,目标是运行Windows 7的平板电脑(不过我希望我的程序在XP上也能稍作修改就能用,并且可以在Linux/Mac上支持鼠标用户)。我写了一个程序,可以捕捉正常的Windows鼠标事件,比如WM_MOUSEMOVE等,然后在画布上绘图。

问题是,鼠标消息在到达我的应用程序之前被修改了。我发现如果我画长线并在每次画线之间停顿,鼠标消息就能正常发送。但如果我快速画几条短线,就会出现问题。具体来说,如果我画一条大约10像素长的下划线,然后在第一条的右边大约5像素的位置再画一条下划线,那么第二条WM_MOUSEDOWN消息却显示它来自和第一条完全相同的位置。

这看起来像是某种预处理,可能是为了防止简单的应用程序在处理双击时感到困惑。但对我这个需要快速手势响应的应用程序来说,这种处理就没什么帮助了。

我找到了一些关于MicrosoftTabletPenServiceProperty原子和CS_DBLCLKS窗口样式的资料,我用以下Python代码把它们都关掉了:

hwnd = self.GetHandle()  
tablet_atom = "MicrosoftTabletPenServiceProperty" 
atom_ID = windll.kernel32.GlobalAddAtomA(tablet_atom)  
windll.user32.SetPropA(hwnd,tablet_atom,1)  
currentstyle = windll.user32.GetClassLongA(hwnd, win32con.GCL_STYLE)  
windll.user32.SetClassLongA(hwnd, win32con.GCL_STYLE, currentstyle & ~win32con.CS_DBLCLKS) 

但是没有任何效果。

我尝试写一个低级别的鼠标驱动程序钩子,使用SetWindowsHookEx,但它也没用——显然鼠标消息在发送到我的低级Windows钩子之前就已经被预处理了。

我非常希望能得到一些关于如何关闭这种预处理的建议。我不想切换到RealTimeStylus——首先因为它在Windows XP和SMART互动白板上无法使用,其次因为我不知道如何在CPython中使用RealTimeStylus,所以我需要切换到IronPython,这样我的代码就无法在Linux/Mac上运行了。

达蒙。

1 个回答

1

对于原始的鼠标消息,你可以在XP及更高版本中使用 WM_INPUT。在Windows 7中,增加了一些与触摸相关的内容,比如 WM_GESTUREWM_TOUCH

撰写回答