teamplayer和pyhook奇怪地互动

时间:2010-07-28 23:25:54

标签: python winapi mouse pywin32

我正在使用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)

也就是说,第一个down事件使用上一个up事件的坐标!问题还在于错误的事件是第一次,使得更难以检测到正确的事件(我不能只说“忽略第一个事件”,因为如果teamplayer关闭或只连接了一个鼠标,那就是唯一一个! )

关于为什么会发生这种情况的任何想法,以及我可以做些什么来获得正常的鼠标事件?

1 个答案:

答案 0 :(得分:1)

多个想法:

  • 检测来自同一时间戳的重复点击,并忽略其中的第一个。这需要延迟处理,直到稍后一次,这会使代码中的问题稍微复杂化......
  • 您可以更改pyhook来源以处理重复项;在源代码中进行调试可以让您更深入地了解正在发生的事情。从简要地看一下,你可以通过排队和刷新消息在HookManager的{​​{1}}函数中执行此操作。一旦你弄清楚那里发生了什么,你可以包装那个对象,这样你就不必修改MouseSwitch
  • pyhook API很可能是生成重复事件的原因;因为teamplayer正在做一些复杂的多个鼠标。报告给teamplayer;他们可能在某些时候有兴趣从他们那边修理它