我正在使用teamplayer,它允许您将更多的鼠标连接到您的计算机上,以便同时使用。我还使用pyHook捕获鼠标事件,代码如下:

import pyHook
import pythoncom

def onclick(event):
  # called when mouse events are received
  print 'MessageName:',event.MessageName
  print 'Message:',event.Message
  print 'Time:',event.Time
  print 'WindowName:',event.WindowName
  print 'Position:',event.Position
  print '---'
  return True

hm = pyHook.HookManager()
hm.MouseLeftDown = onclick
hm.MouseLeftUp = onclick
hm.HookMouse()
pythoncom.PumpMessages()

该代码在没有teamplayer的情况下运行良好-它可以准确地检测鼠标上下按钮。如果我在程序运行时启动teamplayer,那么它仍然可以正常工作,这一次可以准确地检测到两个鼠标的点击。
但是,如果我在启动teamplayer之后启动程序,则每个鼠标单击都会变成两次:
MessageName: mouse left down
Message: 513
Time: 7231317
WindowName: None
Position: (673, 367)
---
MessageName: mouse left down
Message: 513
Time: 7231317
WindowName: None
Position: (673, 367)
---
MessageName: mouse left up
Message: 514
Time: 7231379
WindowName: None
Position: (673, 367)
---
MessageName: mouse left up
Message: 514
Time: 7231379
WindowName: None
Position: (673, 367)

这没关系——我可以用相同的时间戳检测到点击,而忽略第二个。但是,当我用不同的鼠标单击时,模式很奇怪:
MessageName: mouse left down
Message: 513
Time: 7305916
WindowName: C:\Python25\python.exe
Position: (569, 306)
---
MessageName: mouse left down
Message: 513
Time: 7305916
WindowName: C:\Python25\python.exe
Position: (722, 365)
---
MessageName: mouse left up
Message: 514
Time: 7309598
WindowName: C:\Python25\python.exe
Position: (722, 365)
---
MessageName: mouse left up
Message: 514
Time: 7309598
WindowName: C:\Python25\python.exe
Position: (722, 365)

也就是说,第一个向下事件使用最后一个向上事件的坐标!问题还在于,错误的事件是第一个,这使得更难检测到正确的事件(我不能只说“忽略第一个事件”,因为如果teamplayer关闭或只有一个鼠标连接,那就是唯一的事件!)
关于为什么会发生这种情况,以及我能做些什么来获得正常的鼠标事件,有什么想法吗?

最佳答案

多种想法:
从同一时间戳检测重复的单击,并忽略其中的第一个。这需要将处理延迟到稍后的某个时间,这会使代码稍微复杂一些。。。
您可以更改pyhook源代码来处理重复项;在它们的源代码中进行调试可以让您更深入地了解发生了什么。简单地看一下,您可以在其HookManagerMouseSwitch函数中通过排队和刷新消息来完成此操作。一旦你弄清楚那里发生了什么,你就可以把这个对象包装起来,这样你就不必修改pyhook
很可能是SetWindowsHookExAPI生成了重复的事件;因为teamplayer正在用多个鼠标做一些复杂的事情。向TeMePosil报告;他们可能在某个时候有兴趣把它固定在他们的一边。

10-06 11:54