Rilevamento dei clic del mouse in Windows utilizzando Python
Domanda
Come posso rilevare i clic del mouse indipendentemente dalla finestra in cui si trova il mouse?
Perferabliy in Python, ma se qualcuno può spiegarlo in qualsiasi lingua, potrei essere in grado di capirlo.
Ho trovato questo sul sito di Microsoft: http://msdn.microsoft.com/en-us/ biblioteca / ms645533 (VS.85) aspx
Ma non vedo come posso rilevare o ritirare le notifiche elencate.
Provato usando la funzione pygame.mouse.get_pos () di pygame come segue:
import pygame
pygame.init()
while True:
print pygame.mouse.get_pos()
Questo restituisce solo 0,0. Non conosco Pygame, manca qualcosa?
In ogni caso preferirei un metodo senza la necessità di installare un modulo di terze parti. (diverso da pywin32 http://sourceforge.net/projects/pywin32/ )
Soluzione
L'unico modo per rilevare eventi del mouse al di fuori del programma è installare un hook di Windows usando SetWindowsHookEx . Il modulo pyHook racchiude in sé tutti i dettagli. Ecco un esempio che stamperà la posizione di ogni clic del mouse:
import pyHook
import pythoncom
def onclick(event):
print event.Position
return True
hm = pyHook.HookManager()
hm.SubscribeMouseAllButtonsDown(onclick)
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()
Puoi controllare lo script example.py installato con il modulo per ulteriori informazioni sul parametro evento .
pyHook potrebbe essere difficile da usare in uno script Python puro, perché richiede un pump di messaggi attivo. Dal tutorial :
Qualsiasi domanda che desideri ricevere notifiche di eventi di input globali deve avere un pump dei messaggi di Windows. Il il modo più semplice per ottenere uno di questi è utilizzare il metodo PumpMessages in Pacchetto di estensioni Win32 per Python. [...] Quando eseguito, questo programma è disponibile inattivo e attende eventi Windows. Se stai utilizzando un toolkit GUI (ad es. wxPython), questo ciclo non è necessario poiché il toolkit fornisce il proprio.
Altri suggerimenti
Uso win32api. Funziona quando si fa clic su qualsiasi finestra.
# 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, inclusa la programmazione della GUI, è accessibile con Python utilizzando Python per le estensioni di Windows di Mark Hammond. Un estratto del libro O'Reilly da libro mostra come agganciare i messaggi del mouse, .eg:
self.HookMessage(self.OnMouseMove,win32con.WM_MOUSEMOVE)
Raw MFC non è facile o ovvio, ma la ricerca nel web di esempi python può produrre alcuni esempi utilizzabili.
È stato un momento caldo da quando è stata posta questa domanda, ma ho pensato di condividere la mia soluzione: ho appena usato il modulo integrato ctypes
. (Sto usando Python 3.3 a proposito)
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
Il modo Windows per farlo è gestire il messaggio WM_LBUTTONDBLCLK
.
Per poter essere inviato, la classe della finestra deve essere creata con lo stile di classe CS_DBLCLKS
.
Temo di non sapere come applicarlo in Python, ma spero che possa darti qualche suggerimento.