繁体   English   中英

使用python检测windows中的鼠标点击

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM