Обнаружение щелчков мышью в окнах с использованием Python
Вопрос
Как я могу обнаружить щелчки мыши независимо от того, в каком окне она находится?
Perferabliy в Python, но если кто-то может объяснить это в любом языке, я мог бы понять это.
Я нашел это на сайте Microsoft: http://msdn.microsoft.com/en-us/ библиотека / ms645533 (VS.85) .aspx р>
Но я не вижу, как я могу обнаружить или забрать перечисленные уведомления.
Пробовал с использованием функции pygame.mouse.get_pos () следующим образом:
import pygame
pygame.init()
while True:
print pygame.mouse.get_pos()
Это просто возвращает 0,0. Я не знаком с Pygame, чего-то не хватает?
В любом случае, я бы предпочел метод без необходимости установки стороннего модуля. (кроме pywin32 http://sourceforge.net/projects/pywin32/ )
Решение
Единственный способ обнаружить события мыши вне вашей программы - это установить ловушку Windows с помощью SetWindowsHookEx . pyHook инкапсулирует мельчайшие подробности. Вот пример, который будет печатать местоположение каждого щелчка мыши:
import pyHook
import pythoncom
def onclick(event):
print event.Position
return True
hm = pyHook.HookManager()
hm.SubscribeMouseAllButtonsDown(onclick)
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()
Вы можете проверить скрипт example.py , установленный вместе с модулем, для получения дополнительной информации о параметре событие .
pyHook может быть сложно использовать в чистом скрипте Python, потому что он требует активной рассылки сообщений. Из учебного пособия а>: р>
Любое приложение, которое желает получить
уведомления о глобальных событиях ввода
должен иметь насос сообщений Windows.
Самый простой способ получить один из них - это
используйте метод PumpMessages в
Пакет расширений Win32 для Python.
[...] При запуске эта программа просто сидит
простаивает и ждет событий Windows. Если
Вы используете инструментарий GUI (например,
wxPython), этот цикл не нужен
поскольку инструментарий предоставляет свой собственный.
Другие советы
Я использую win32api. Работает при нажатии на любые окна.
# 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, включая программирование с графическим интерфейсом, доступна через python с помощью расширений Python для Windows Марк Хаммонд Отрывок из книги О'Рейли от Хаммонда и Робинсона book показывает, как перехватывать сообщения мыши, .eg:
self.HookMessage(self.OnMouseMove,win32con.WM_MOUSEMOVE)
Необработанный MFC не прост и не очевиден, но поиск в Интернете примеров Python может привести к некоторым полезным примерам.
Это была горячая минута с тех пор, как был задан этот вопрос, но я решил поделиться своим решением: я просто использовал встроенный модуль ctypes
. (Я использую Python 3.3 кстати)
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
Способ Windows сделать это - обработать сообщение WM_LBUTTONDBLCLK
. Р>
Чтобы это было отправлено, ваш класс окна должен быть создан в стиле класса CS_DBLCLKS
.
Боюсь, я не знаю, как применить это в Python, но, надеюсь, это может дать вам некоторые подсказки.