使用python检测Windows中的鼠标单击

时间:2008-10-03 02:51:44

标签: python windows mouse

无论鼠标位于哪个窗口,我如何检测鼠标点击?

在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,缺少什么?

在任何情况下,我都更喜欢不需要安装第三方模块的方法。 (除了pywin32 http://sourceforge.net/projects/pywin32/

5 个答案:

答案 0 :(得分:31)

检测程序外部鼠标事件的唯一方法是使用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 脚本,了解有关事件参数的详细信息。

pyHook在纯Python脚本中使用可能很棘手,因为它需要一个活动的消息泵。来自tutorial

  

任何希望收到的申请   全局输入事件的通知   必须有一个Windows消息泵。该   获得其中之一的最简单方法是   在中使用PumpMessages方法   适用于Python的Win32 Extensions包。   [...]运行时,这个程序就坐了   空闲并等待Windows事件。如果   您正在使用GUI工具包(例如   wxPython),这个循环是不必要的   因为工具包提供了自己的。

答案 1 :(得分:15)

我使用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)

答案 2 :(得分:4)

使用Mark Hammond的Python for Windows extensions可以使用python访问Windows MFC,包括GUI编程。来自Hammond's和Robinson的An O'Reilly Book Excerptbook显示了如何挂钩鼠标消息,.e.g:

self.HookMessage(self.OnMouseMove,win32con.WM_MOUSEMOVE)

原始MFC并不容易或明显,但在Web上搜索python示例可能会产生一些可用的示例。

答案 3 :(得分:3)

自问这个问题以来,这已经过了一分钟,但我想我会分享我的解决方案:我只使用了内置模块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

答案 4 :(得分:2)

执行此操作的方法是处理WM_LBUTTONDBLCLK消息。

要发送此内容,需要使用CS_DBLCLKS类样式创建窗口类。

我担心我不知道如何在Python中应用它,但希望它可能会给你一些提示。