27 Stimmen

Erkennung von Mausklicks in Windows mit Python

Wie kann ich Mausklicks unabhängig davon erkennen, in welchem Fenster sich die Maus befindet?

Am liebsten in Python, aber wenn jemand es in einer anderen Sprache erklären kann, kann ich es vielleicht auch herausfinden.

Ich habe dies auf der Website von Microsoft gefunden: http://msdn.microsoft.com/en-us/library/ms645533(VS.85).aspx

Aber ich weiß nicht, wie ich die aufgelisteten Benachrichtigungen erkennen oder abrufen kann.

Ich habe versucht, pygame's pygame.mouse.get_pos() Funktion wie folgt zu verwenden:

import pygame
pygame.init()
while True:
    print pygame.mouse.get_pos()

Dies ergibt einfach 0,0. Ich bin nicht vertraut mit pygame, fehlt etwas?

Auf jeden Fall würde ich eine Methode bevorzugen, bei der man kein Modul eines Drittanbieters installieren muss. (anders als pywin32 http://sourceforge.net/projects/pywin32/ )

32voto

efotinis Punkte 13896

Die einzige Möglichkeit, Mausereignisse außerhalb Ihres Programms zu erkennen, ist die Installation eines Windows-Hooks mit SetWindowsHookEx . Die pyHook Modul kapselt die wichtigsten Details. Hier ist ein Beispiel, das die Position jedes Mausklicks ausgibt:

import pyHook
import pythoncom

def onclick(event):
    print event.Position
    return True

hm = pyHook.HookManager()
hm.SubscribeMouseAllButtonsDown(onclick)
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()

Sie können die beispiel.py Skript, das mit dem Modul installiert wird, für weitere Informationen über die Veranstaltung Parameter.

pyHook könnte in einem reinen Python-Skript schwierig zu verwenden sein, da es eine aktive Nachrichtenpumpe erfordert. Von der Lehrgang :

Jede Anwendung, die Folgendes erhalten möchte Benachrichtigungen über globale Eingabeereignisse empfangen möchte, muss über eine Windows-Nachrichtenpumpe verfügen. Die einfachste Weg, eine solche zu erhalten, ist die ist die Verwendung der PumpMessages-Methode aus dem [...] [...] Wenn dieses Programm ausgeführt wird, sitzt es einfach im Leerlauf und wartet auf Windows-Ereignisse. Wenn Sie ein GUI-Toolkit verwenden (z.B. wxPython), ist diese Schleife unnötig da das Toolkit seine eigene Schleife bereitstellt.

23voto

Markacho Punkte 272

Ich verwende win32api. Es funktioniert, wenn Sie auf ein beliebiges Windows klicken.

# 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)

8voto

diligar Punkte 393

Es ist eine heiße Minute her, dass diese Frage gestellt wurde, aber ich dachte, ich teile meine Lösung mit: Ich habe einfach das eingebaute Modul ctypes . (Ich verwende 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

5voto

gimel Punkte 78080

Windows MFC, einschließlich der GUI-Programmierung, ist mit Python unter Verwendung der Python für Windows-Erweiterungen von Mark Hammond. Ein Auszug aus dem O'Reilly-Buch von Hammond und Robinson's Buch zeigt, wie man Mausmeldungen einhängt, z. B:

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

Raw MFC ist nicht einfach oder offensichtlich, aber eine Suche im Web nach Python-Beispielen kann einige brauchbare Beispiele liefern.

2voto

MrZebra Punkte 11337

Die Windows-Methode besteht darin, die WM_LBUTTONDBLCLK Nachricht.

Damit dies gesendet werden kann, muss Ihre Fensterklasse mit der CS_DBLCLKS Stil der Klasse.

Ich weiß leider nicht, wie man das in Python anwendet, aber ich hoffe, es gibt Ihnen ein paar Hinweise.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X