使用python检测鼠标在窗口中的点击
无论鼠标在哪个窗口中,我如何检测鼠标点击?
在python perferabliy,但如果有人可以用任何语言解释它,我可能会弄清楚。
我在微软的网站上发现这个: http : //msdn.microsoft.com/en-us/library/ms645533(VS.85).aspx
但是我不知道如何检测或提取列出的通知。
尝试使用pygame的pygame.mouse.get_pos()函数,如下所示:
import pygame pygame.init() while True: print pygame.mouse.get_pos()
这只是返回0,0。 我不熟悉pygame,是缺less的东西?
在任何情况下,我宁愿一个方法,而不需要安装第三方模块。 (除了pywin32 http://sourceforge.net/projects/pywin32/ )
在程序外部检测鼠标事件的唯一方法是使用SetWindowsHookEx安装Windows钩子。 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脚本以获取有关event参数的更多信息。
pyHook在纯Python脚本中使用可能会非常棘手,因为它需要一个主动消息泵。 从教程 :
任何希望接收全局input事件通知的应用程序都必须具有Windows消息泵。 最简单的方法是使用Python的Win32 Extensions包中的PumpMessages方法。 […]运行时,这个程序只是闲置,等待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)
包括GUI编程在内的Windows MFC可以通过Mark Hammond使用Python扩展的Python来访问。 Hammond和Robinson的书中 的O'Reilly书摘录显示了如何钩住鼠标消息,例如:
self.HookMessage(self.OnMouseMove,win32con.WM_MOUSEMOVE)
原始的MFC并不容易或者显而易见,但是在networking上searchpython的例子可能会产生一些有用的例子。
窗口的做法是处理WM_LBUTTONDBLCLK
消息。
为了发送,需要使用CS_DBLCLKS
类风格创build窗口类。
恐怕我不知道如何在Python中使用它,但希望它能给你一些提示。
自问这个问题以来,这是一个热门的分钟,但我想我会分享我的解决scheme:我只是使用内置的模块ctypes
。 (我使用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