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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top