Pythonを使用したウィンドウでのマウスクリックの検出
質問
マウスが入っているウィンドウに関係なく、マウスクリックを検出するにはどうすればよいですか?
PythonのPerferabliyですが、誰かがそれを言語で説明できるなら、私はそれを理解できるかもしれません。
Microsoftのサイトでこれを見つけました。 http://msdn.microsoft.com/en-us/ library / ms645533(VS.85).aspx
ただし、リストされた通知を検出または取得する方法がわかりません。
次のようにpygameのpygame.mouse.get_pos()関数を使用してみました:
import pygame
pygame.init()
while True:
print pygame.mouse.get_pos()
これは0,0を返します。 pygameに慣れていないのですが、何か不足していますか?
いずれにせよ、サードパーティのモジュールをインストールする必要のない方法を好むでしょう。 (pywin32 http://sourceforge.net/projects/pywin32/ 以外)
解決
プログラムの外部でマウスイベントを検出する唯一の方法は、 SetWindowsHookEx 。 pyHook モジュールは、核心の詳細をカプセル化します。マウスのクリックごとに場所を出力するサンプルを次に示します。
import pyHook
import pythoncom
def onclick(event):
print event.Position
return True
hm = pyHook.HookManager()
hm.SubscribeMouseAllButtonsDown(onclick)
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()
event パラメータの詳細については、モジュールとともにインストールされている example.py スクリプトを確認できます。
pyHookは、アクティブなメッセージポンプを必要とするため、純粋なPythonスクリプトで使用するのは難しいかもしれません。 チュートリアル:
受信を希望するアプリケーション グローバル入力イベントの通知 Windowsメッセージポンプが必要です。の これらのいずれかを取得する最も簡単な方法は でPumpMessagesメソッドを使用します Python用のWin32拡張パッケージ。 [...]実行すると、このプログラムはただ座っています アイドル状態で、Windowsイベントを待機します。もし GUIツールキットを使用している(例: wxPython)、このループは不要です ツールキットが独自に提供するため。
他のヒント
win32apiを使用します。どのウィンドウをクリックしても機能します。
# Code to check if left or right mouse buttons were pressed
import win32api
import time
state_left = win32api.GetKeyState(0x01) # Left button down = 0 or 1. Button up = -127 or -128
state_right = win32api.GetKeyState(0x02) # Right button down = 0 or 1. Button up = -127 or -128
while True:
a = win32api.GetKeyState(0x01)
b = win32api.GetKeyState(0x02)
if a != state_left: # Button state changed
state_left = a
print(a)
if a < 0:
print('Left Button Pressed')
else:
print('Left Button Released')
if b != state_right: # Button state changed
state_right = b
print(b)
if b < 0:
print('Right Button Pressed')
else:
print('Right Button Released')
time.sleep(0.001)
GUIプログラミングを含むWindows MFCは、 Windows拡張機能用Python を使用して、Pythonでアクセスできます。マーク・ハモンド。 ハモンドとロビンソンの
self.HookMessage(self.OnMouseMove,win32con.WM_MOUSEMOVE)
未加工のMFCは簡単または明白ではありませんが、Pythonの例をWebで検索すると、いくつかの有用な例が得られる場合があります。
この質問が出されてから大変なことになりましたが、私は自分の解決策を共有すると思いました。組み込みモジュール ctypes
を使用しただけです。 (私はPython 3.3 btwを使用しています)
import ctypes
import time
def DetectClick(button, watchtime = 5):
'''Waits watchtime seconds. Returns True on click, False otherwise'''
if button in (1, '1', 'l', 'L', 'left', 'Left', 'LEFT'):
bnum = 0x01
elif button in (2, '2', 'r', 'R', 'right', 'Right', 'RIGHT'):
bnum = 0x02
start = time.time()
while 1:
if ctypes.windll.user32.GetKeyState(bnum) not in [0, 1]:
# ^ this returns either 0 or 1 when button is not being held down
return True
elif time.time() - start >= watchtime:
break
time.sleep(0.001)
return False
それを行うWindowsの方法は、 WM_LBUTTONDBLCLK
メッセージを処理することです。
これを送信するには、 CS_DBLCLKS
クラススタイルでウィンドウクラスを作成する必要があります。
Pythonでこれを適用する方法がわからないのではないかと思いますが、うまくいけばヒントになるかもしれません。