[英]Detecting Mouse clicks in windows using 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 不熟悉,有什么遗漏吗?
无论如何,我更喜欢一种无需安装第 3 方模块的方法。 (除了 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脚本以获取有关事件参数的更多信息。
在纯 Python 脚本中使用 pyHook 可能会很棘手,因为它需要一个活动的消息泵。 从教程:
任何希望接收全局输入事件通知的应用程序都必须具有 Windows 消息泵。 获得其中之一的最简单方法是使用 Python 的 Win32 扩展包中的 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)
自从提出这个问题以来,这已经很热了,但我想我会分享我的解决方案:我只是使用了内置模块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 MFC,包括 GUI 编程,可以通过 Python 使用 Mark Hammond 的Python for Windows 扩展来访问。 Hammond 和 Robinson 的书中的 O'Reilly Book 摘录展示了如何挂钩鼠标消息,例如:
self.HookMessage(self.OnMouseMove,win32con.WM_MOUSEMOVE)
原始 MFC 并不容易或显而易见,但在网络上搜索 python 示例可能会产生一些可用的示例。
Windows 的做法是处理WM_LBUTTONDBLCLK
消息。
为了发送这个,你的窗口类需要用CS_DBLCLKS
类样式创建。
恐怕我不知道如何在 Python 中应用它,但希望它能给你一些提示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.