3

私は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の起動後にプログラムを起動すると、すべてのマウスクリックが2倍になります。

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)

これは問題ありません。同じタイムスタンプのクリックを検出し、2番目のクリックを無視することができます。ただし、別のマウスでクリックすると、パターンが奇妙になります。

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)

つまり、最初のダウンイベントは、最後のアップイベントの座標を使用します。問題は、間違ったイベントが最初に発生し、正しいイベントを検出するのが難しくなることです(チームプレーヤーがオフになっている場合、またはマウスが1つしか接続されていない場合は、それだけであるため、「最初のイベントを無視する」とは言えません。 )。

なぜこれが起こっているのか、そして通常のマウスイベントを取得するために私ができることについてのアイデアはありますか?

4

1 に答える 1

1

複数のアイデア:

  • 同じタイムスタンプから重複したクリックを検出し、最初のクリックを無視します。これには、1 回ティックするまで処理を遅らせる必要があり、コードが少し複雑になります...
  • pyhook代わりに重複を処理するようにソースを変更できます。ソース コード内でデバッグすると、何が起こっているかについてより多くの洞察が得られる場合があります。簡単に見ると、メッセージをキューに入れたりフラッシュしたりすることで、HookManagerの関数でこれを行うことができます。MouseSwitchそこで何が起こっているのかを理解したら、そのオブジェクトをラップして、変更する必要がないようにすることができますpyhook
  • SetWindowsHookExAPI が重複したイベントを生成している可能性が最も高いです。チームプレイヤーが複数のマウスを使って複雑なことをしているからです。これをチームプレーヤーに報告してください。彼らはある時点で彼らの側からそれを修正することに興味があるかもしれません
于 2010-12-06T15:53:59.137 に答える