Wykrywanie kliknięć myszką w systemie Windows za pomocą Pythona

Jak mogę wykryć kliknięcia myszy niezależnie od okna, w którym znajduje się mysz?

Perferabliy w Pythonie, ale jeśli ktoś może to wyjaśnić w jakimkolwiek langauge może będę w stanie to rozgryźć.

Znalazłem to na stronie Microsoftu: http://msdn.microsoft.com/en-us/library/ms645533 (VS.85). aspx

Ale nie widzę, w jaki sposób mogę wykryć lub odebrać wymienione powiadomienia.

Próbowałem użyć pygame ' a.mysz.funkcja get_pos () wygląda następująco:
import pygame
pygame.init()
while True:
    print pygame.mouse.get_pos()

To po prostu zwraca 0,0. Nie znam pygame, czy czegoś brakuje?

W każdym razie wolałbym metodę bez konieczności instalowania modułu 3rd party. (inne niż pywin32 http://sourceforge.net/projects/pywin32/ )

Author: monkut, 2008-10-03

5 answers

Jedynym sposobem wykrywania zdarzeń myszy poza programem jest zainstalowanie Hooka Windows za pomocą SetWindowsHookEx. Moduł pyHook zawiera szczegółowe szczegóły. Oto przykład, który wyświetli lokalizację każdego kliknięcia myszką:

import pyHook
import pythoncom

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

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

Możesz sprawdzić example.py skrypt instalowany wraz z modułem, aby uzyskać więcej informacji o parametrze event .

PyHook może być trudny w użyciu w czystym skrypcie Pythona, ponieważ wymaga aktywna pompa wiadomości. Z poradnika :

Każdy wniosek, który chce otrzymać powiadomienia o globalnych zdarzeniach wejściowych musi mieć Windows message pump. Na najprostszym sposobem na uzyskanie jednego z nich jest stosować metodę PumpMessages w Pakiet rozszerzeń Win32 dla Pythona. [...] Po uruchomieniu ten program po prostu siedzi bezczynność i czeka na zdarzenia systemu Windows. Jeśli używasz zestawu narzędzi GUI (np. wxPython), pętla ta jest niepotrzebna ponieważ zestaw narzędzi zapewnia jego własne.

 30
Author: efotinis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-15 08:16:48

Używam win32api. Działa po kliknięciu na dowolne okna.

# 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)
 13
Author: Markacho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-30 07:01:35

Windows MFC, w tym programowanie GUI, jest dostępne w Pythonie za pomocą Python for Windows extensions autorstwa Marka Hammonda. fragment książki O 'Reilly' ego z książki Hammonda i Robinsona pokazuje, jak zaczepić wiadomości myszy,.e. g:

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

Raw MFC nie jest łatwe ani oczywiste, ale wyszukiwanie w sieci przykładów Pythona może dać kilka użytecznych przykładów.

 4
Author: gimel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 09:56:35

Upłynęła gorąca minuta odkąd zadano to pytanie, ale pomyślałem, że podzielę się moim rozwiązaniem: właśnie użyłem wbudowanego modułu ctypes. (Używam Pythona 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
 3
Author: diligar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-06 00:24:34

Sposobem windows jest obsługa wiadomości WM_LBUTTONDBLCLK.

Aby to wysłać, twoja klasa okna musi zostać utworzona za pomocą stylu klasy CS_DBLCLKS.

Obawiam się, że nie wiem, jak zastosować to w Pythonie, ale mam nadzieję, że da ci to jakieś wskazówki.

 2
Author: MrZebra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-03 09:13:27