Detecting Mausklicks in Fenstern mit Python
Frage
Wie kann ich erkennen, unabhängig von den Fenstern Mausklicks die Maus in?
Perferabliy in Python, aber wenn jemand es in jedem Langauge erklären kann, könnte ich in der Lage sein, um es herauszufinden.
Ich fand diese auf Microsofts Website: http://msdn.microsoft.com/en-us/ Bibliothek / ms645533 (VS.85) aspx
Aber ich sehe nicht, wie ich erkennen kann, oder die Meldungen abholen aufgeführt.
Versuchte pygame der pygame.mouse.get_pos () Funktion wie folgt:
import pygame
pygame.init()
while True:
print pygame.mouse.get_pos()
Das gibt nur 0,0. Ich bin nicht vertraut mit pygame, ist etwas fehlt?
In anycase würde ich eine Methode, ohne dass es vorziehen, ein 3rd-Party-Modul zu installieren. (Ausgenommen pywin32 http://sourceforge.net/projects/pywin32/ )
Lösung
Die einzige Möglichkeit, Mausereignisse zu erfassen außerhalb Ihres Programm ist ein Windows-Haken mit SetWindowsHookEx . Die pyHook Modul kapselt die wesentlichen Details. Hier ist ein Beispiel, das die Position von jedem Mausklick gedruckt werden:
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 das überprüfen example.py Skript, das mit dem Modul für weitere Informationen über das Ereignis Parameter.
installiertpyHook könnte schwierig sein, in einem reinen Python-Skript zu verwenden, da sie eine aktive Meldung Pumpe erfordert. Aus dem Tutorial
Jede Anwendung, die erhalten möchte Meldungen der globalen Eingabeereignisse haben eine Windows-Meldung Pumpe muss. Das einfachste Weg, eine von ihnen zu erhalten ist, verwenden, um die Methode in der Pumpmessages Win32-Erweiterungen Paket für Python. [...] Wenn er gestartet wird, ist dieses Programm sitzt nur Leerlauf und wartet auf Windows-Ereignisse. Wenn Sie werden mit einem GUI-Toolkit (z WxPython) Diese Schleife ist unnötig da das Toolkit bietet seine eigenen.
Andere Tipps
Ich verwende win32api. Es funktioniert, wenn auf jedem 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)
Windows-MFC, einschließlich GUI-Programmierung ist, zugänglich mit Python mit dem Python für Erweiterungen von Windows durch Mark Hammond. Ein O'Reilly Buchauszug von Hammonds und Robinson Buch zeigt, wie Maus-Nachrichten an Haken, .eg:
self.HookMessage(self.OnMouseMove,win32con.WM_MOUSEMOVE)
Raw MFC ist nicht einfach oder offensichtlich, aber das Web für Python Suche Beispiele können einige verwendbare Beispiele ergeben.
Es ist schon eine heiße Minute, da diese Frage gestellt wurde, aber ich dachte, dass ich meine Lösung teilen würde: Ich habe nur das Einbaumodul 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
Die Fenster Art und Weise, es zu tun ist, um die WM_LBUTTONDBLCLK
Nachricht zu verarbeiten.
Für diese gesendet werden, Ihre Fensterklasse muss mit dem CS_DBLCLKS
Klasse Stil geschaffen werden.
Ich fürchte, ich weiß nicht, wie dies in Python bewerben, aber hoffentlich kann es Ihnen einige Hinweise geben.