在Windows中使用Python检测鼠标点击
我该如何检测鼠标点击,无论鼠标在哪个窗口里?
最好是用Python来实现,不过如果有人能用其他语言解释,我也许能理解。
我在微软的网站上找到了这个:
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不太熟悉,是不是缺少什么?
总之,我更希望能找到一种方法,不需要安装第三方模块。(除了pywin32 http://sourceforge.net/projects/pywin32/)
5 个回答
8
这个问题问了有一段时间了,但我想分享一下我的解决办法:我直接用了内置的模块 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
23
我使用的是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)
32
要检测你程序外部的鼠标事件,唯一的方法就是使用一个叫做 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 参数的更多信息。
在纯Python脚本中使用pyHook可能会有点麻烦,因为它需要一个活跃的消息循环。根据这个 教程:
任何想要接收全局输入事件通知的应用程序,都必须有一个Windows消息循环。获取这个循环最简单的方法是使用Python的Win32扩展包中的PumpMessages方法。[...] 运行这个程序时,它会静静地等待Windows事件。如果你使用的是图形用户界面工具包(比如wxPython),那么这个循环就不需要了,因为工具包会提供自己的循环。