اكتشاف نقرات الماوس في Windows باستخدام Python
سؤال
كيف يمكنني اكتشاف نقرات الماوس بغض النظر عن النافذة التي يوجد فيها الماوس؟
Perferabliy في Python ، ولكن إذا تمكن شخص ما من شرح ذلك في أي langauge ، فقد أتمكن من اكتشاف ذلك.
لقد وجدت هذا على موقع Microsoft:http://msdn.microsoft.com/en-us/library/ms645533(vs.85).aspx
لكنني لا أرى كيف يمكنني اكتشاف أو التقاط الإخطارات المدرجة.
حاول استخدام وظيفة pygame.mouse.get_pos () Pygame على النحو التالي:
import pygame
pygame.init()
while True:
print pygame.mouse.get_pos()
هذا يعود فقط 0،0. لست على دراية ببيجام ، هل شيء مفقود؟
في أي حال ، أفضل طريقة دون الحاجة إلى تثبيت وحدة الطرف الثالث. (بخلاف Pywin32 http://sourceforge.net/projects/pywin32/ )
المحلول
الطريقة الوحيدة لاكتشاف أحداث الماوس خارج البرنامج هي تثبيت خطاف Windows باستخدام Setwindowshookex. ال بيهوك الوحدة النمطية تغلف التفاصيل الدقيقة. إليك عينة ستطبع موقع كل ماوس:
import pyHook
import pythoncom
def onclick(event):
print event.Position
return True
hm = pyHook.HookManager()
hm.SubscribeMouseAllButtonsDown(onclick)
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()
يمكنك التحقق من مثال البرنامج النصي المثبت مع الوحدة لمزيد من المعلومات حول حدث معامل.
قد يكون Pyhook صعبًا في استخدامه في نص Python النقي ، لأنه يتطلب مضخة رسائل نشطة. من الدورة التعليمية:
يجب أن يحتوي أي تطبيق يرغب في تلقي إشعارات أحداث الإدخال العالمية على مضخة رسائل Windows. أسهل طريقة للحصول على واحدة من هذه هي استخدام طريقة Pumpmessages في حزمة Extensions Win32 لـ Python. [...] عند التشغيل ، يجلس هذا البرنامج فقط وينتظر أحداث Windows. إذا كنت تستخدم مجموعة أدوات واجهة المستخدم الرسومية (مثل Wxpython) ، فإن هذه الحلقة غير ضرورية لأن مجموعة الأدوات توفرها.
نصائح أخرى
أنا استخدم win32api. إنه يعمل عند النقر على أي Windows.
# 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 باستخدام بيثون لتمديدات Windows بقلم مارك هاموند. مقتطف من كتاب أورايلي من Hammond's و Robinson's الكتاب يوضح كيفية ربط رسائل الماوس ، .EG:
self.HookMessage(self.OnMouseMove,win32con.WM_MOUSEMOVE)
RAW MFC ليس بالأمر السهل أو الواضح ، ولكن البحث عن الويب عن أمثلة Python قد يؤدي إلى بعض الأمثلة القابلة للاستخدام.
لقد كانت دقيقة ساخنة منذ طرح هذا السؤال ، لكنني اعتقدت أنني سأشارك حللي: لقد استخدمت للتو الوحدة النمطية المدمجة ctypes
. (أنا أستخدم بيثون 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
نمط الفصل.
أخشى أنني لا أعرف كيفية تطبيق هذا في بيثون ، ولكن آمل أن يمنحك بعض التلميحات.