24

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

Perferabliy in 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/

4

5 回答 5

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脚本以获取有关事件参数的更多信息。

在纯 Python 脚本中使用 pyHook 可能会很棘手,因为它需要一个主动的消息泵。从教程

任何希望接收全局输入事件通知的应用程序都必须具有 Windows 消息泵。获得其中之一的最简单方法是使用 Python 的 Win32 扩展包中的 PumpMessages 方法。[...] 运行时,该程序只是闲置并等待 Windows 事件。如果您使用的是 GUI 工具包(例如 wxPython),则该循环是不必要的,因为该工具包提供了自己的。

于 2008-10-03T21:38:15.320 回答
20

我使用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)
于 2017-01-30T07:01:35.750 回答
7

自从提出这个问题以来,这是一个热门的时刻,但我想我会分享我的解决方案:我刚刚使用了 built-in module 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
于 2017-10-06T00:24:34.810 回答
4

Windows MFC,包括 GUI 编程,可以通过 Python 使用Mark Hammond的Python for Windows 扩展来访问。来自 Hammond 和 Robinson 的书中的 O'Reilly 书籍摘录展示了如何挂钩鼠标消息,例如:

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

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

于 2008-10-03T09:56:35.030 回答
2

windows的做法是处理WM_LBUTTONDBLCLK消息。

要发送此信息,您的窗口类需要使用CS_DBLCLKS类样式创建。

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

于 2008-10-03T09:13:27.253 回答