【问题标题】:Precise response to tablet/mouse events in Windows精确响应 Windows 中的平板电脑/鼠标事件
【发布时间】:2009-09-29 19:41:04
【问题描述】:

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

我正在使用 Python 2.6 进行编程,目标是运行 Windows 7 的平板电脑(尽管我希望我的程序在 XP 上通过 SMART 交互式白板进行少量修改,并且适用于 Linux/Mac 上的鼠标用户)。我编写了一个程序,它可以连接到正常的 Windows 鼠标事件、WM_MOUSEMOVE 等,并在画布上进行书写。

问题是鼠标消息在到达我的应用程序之前就被摆弄了。我发现如果我进行长笔划并在笔划之间暂停,则鼠标消息会正确发送。但是如果我做了几个快速的短笔划,那么有些东西正在做无用的预处理。具体来说,如果我进行了大约 10 像素长的下划,然后在第一个右侧约 5 个像素处再次下划,则第二个 WM_MOUSEDOWN 报告它来自与第一个完全相同的位置。

这看起来像是某种预处理,也许是为了让幼稚的应用程序不会对双击感到困惑。但是对于我的应用程序,我希望对快速手势做出非常忠实的响应,这是没有帮助的。

我找到了对 MicrosoftTabletPenServiceProperty atom 和 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 plus SMART 交互式白板上工作,其次是因为我看不到如何在 CPython 中使用 RealTimeStylus,所以我需要切换到 IronPython,然后我的代码将不再在 Linux/Mac 上运行。

达蒙。

【问题讨论】:

  • 我不知道答案,但我建议使用更多标签,如 Windows-7 或任何看起来更适合您的标签。除了找到 RealTimeStylus 的 Python 接口外,这并不涉及太多 Python;也许你甚至想把这个 Python 部分分解成一个单独的问题,因为更多的人会读一个句子而不是 30 个。 (虽然我在这里可能是错的,所以请自己做出更明智的选择。)
  • 过滤双击是没有意义的——应用程序不会检查多个 MOUSEDOWN 事件来检测双击;这就是 WM_LBUTTONDBLCLK 等的用途。我不知道发生了什么,但对于诊断,我建议看看鼠标是否会发生这种情况;看到它发生在 XP 中;记录 WM_MOUSEMOVE 事件以及 WM_MOUSEDOWN 事件,看看是否有什么突出的;看看在 Win7 乱七八糟的无用控制面板中是否有类似于 XP 的“提高指针精度”设置的东西。

标签: python winapi tablet-pc


【解决方案1】:

对于原始鼠标消息,您可以在 XP 及更高版本上使用WM_INPUT。 7 添加了一些特定于触摸的东西:WM_GESTURE 和 WM_TOUCH

【讨论】:

  • 这正是我想要的。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-11-24
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多