在Windows中使用Python检测鼠标点击

27 投票
5 回答
92885 浏览
提问于 2025-04-11 09:27

我该如何检测鼠标点击,无论鼠标在哪个窗口里?

最好是用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),那么这个循环就不需要了,因为工具包会提供自己的循环。

撰写回答