Question

Comment détecter les clics de souris quelle que soit la fenêtre dans laquelle se trouve la souris?

Parfaitement en python, mais si quelqu'un peut l'expliquer dans n'importe quelle langue, je pourrais peut-être le comprendre.

J'ai trouvé ceci sur le site de Microsoft: http://msdn.microsoft.com/en-us/ bibliothèque / ms645533 (VS.85) .aspx

Mais je ne vois pas comment détecter ou récupérer les notifications répertoriées.

J'ai essayé d'utiliser la fonction pygame.mouse.get_pos () de pygame comme suit:

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

Ceci ne fait que renvoyer 0,0. Je ne connais pas pygame, il manque quelque chose?

Dans tous les cas, je préférerais une méthode sans la nécessité d'installer un module tiers. (autre que pywin32 http://sourceforge.net/projects/pywin32/ )

Était-ce utile?

La solution

Le seul moyen de détecter les événements de souris en dehors de votre programme consiste à installer un hook Windows à l'aide de SetWindowsHookEx . Le module pyHook encapsule les détails détaillés. Voici un exemple qui imprimera l'emplacement de chaque clic de souris:

import pyHook
import pythoncom

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

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

Vous pouvez consulter le script example.py installé avec le module pour plus d'informations sur le paramètre événement .

pyHook peut être délicat à utiliser dans un script Python pur, car il nécessite une pompe de messages active. Extrait du didacticiel :

  

Toute application qui souhaite recevoir   notifications d'événements d'entrée globaux   doit avoir une pompe de message Windows. le   Le moyen le plus simple d’obtenir l’un d’eux est de   utilisez la méthode PumpMessages dans le   Package d'extensions Win32 pour Python.   [...] Lorsqu'il est exécuté, ce programme ne fait que rester   inactif et attend les événements Windows. Si   vous utilisez une boîte à outils d'interface graphique (par exemple,   wxPython), cette boucle est inutile   puisque la boîte à outils fournit la sienne.

Autres conseils

J'utilise win32api. Cela fonctionne lorsque vous cliquez sur une fenêtre.

# 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, y compris la programmation graphique, est accessible avec python à l'aide des extensions Python pour Windows par Mark Hammond. un extrait du livre O'Reilly de Hammond et Robinson book explique comment accrocher les messages de la souris, par exemple,

.

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

Le format MFC brut n’est ni facile ni évident, mais la recherche d’exemples en python sur le Web peut donner des exemples utilisables.

La question a été brûlante depuis que cette question a été posée, mais je pensais partager ma solution: je viens d'utiliser le module intégré ctypes . (J'utilise 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

La manière la plus simple pour Windows consiste à gérer le message WM_LBUTTONDBLCLK .

Pour que cela soit envoyé, votre classe window doit être créée avec le style de classe CS_DBLCLKS .

J'ai bien peur de ne pas savoir comment appliquer cela en Python, mais j'espère que cela vous donnera des indices.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top