web-dev-qa-db-ja.com

pythonを使用してウィンドウ内のマウスクリックを検出する

マウスが置かれているウィンドウに関係なく、マウスのクリックをどのように検出できますか?

Pythonでperferabliyが、誰かがそれを任意の言語で説明できる場合、私はそれを理解できるかもしれません。

これをマイクロソフトのサイトで見つけました: 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/

21
monkut

プログラムの外部でマウスイベントを検出する唯一の方法は、 SetWindowsHookEx を使用してWindowsフックをインストールすることです。 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スクリプトで使用するのは難しいかもしれません。 tutorial から:

グローバル入力イベントの通知を受信するアプリケーションには、Windowsメッセージポンプが必要です。これらのいずれかを取得する最も簡単な方法は、Python用のWin32拡張パッケージのPumpMessagesメソッドを使用することです。 [...]実行すると、このプログラムはアイドル状態になり、Windowsイベントを待ちます。 GUIツールキット(wxPythonなど)を使用している場合、ツールキットが独自に提供するため、このループは不要です。

31
efotinis

私は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)
17
Markacho

GUIプログラミングを含むWindows MFCは、pythonを使用して Python for Windows拡張機能 を使用してMark Hammondによってアクセスできます。 An O'Reilly Bookの抜粋 ハモンドとロビンソンの book は、マウスメッセージをフックする方法を示しています。例:

self.HookMessage(self.OnMouseMove,win32con.WM_MOUSEMOVE)

生のMFCは簡単でも明白でもありませんが、pythonの例をWebで検索すると、いくつかの使用可能な例が得られる場合があります。

4
gimel

この質問が出されてからとても暑いですが、私は自分の解決策を共有したいと思いました。組み込みモジュール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
3
diligar

Windowsで行う方法は、WM_LBUTTONDBLCLKメッセージを処理することです。

これを送信するには、ウィンドウクラスをCS_DBLCLKSクラススタイルで作成する必要があります。

これをPythonに適用する方法がわからないのではないでしょうか。

2
MrZebra