質問

マウスが入っているウィンドウに関係なく、マウスクリックを検出するにはどうすればよいですか?

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でアクセスできます。マーク・ハモンド。 ハモンドとロビンソンの /oreilly.com/catalog/9781565926219/ "rel =" nofollow noreferrer "> book は、マウスメッセージをフックする方法を示しています。例:

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でこれを適用する方法がわからないのではないかと思いますが、うまくいけばヒントになるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top