2008-10-03 51 views
16

無論鼠標在哪個窗口中,我如何檢測鼠標點擊?使用python檢測窗口中的鼠標點擊

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/

+0

您正在使用哪個UI工具包/庫? – 2008-10-03 03:13:34

+2

我認爲這應該可以使用win32ui和ctypes。我發現我可以通過windll.user32.GetCursorPos(pointer(pt_struct))獲取鼠標位置(詳情請見:http://monkut.webfactional.com/blog/archive/2008/10/2/python-win-mouse - 位) – monkut 2008-10-03 07:44:51

回答

29

在程序外部檢測鼠標事件的唯一方法是使用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消息泵的任何應用程序。 獲取其中一種方法的最簡單方法是使用 Win32 Extensions包中的PumpMessages方法爲 。 [...]在運行時,該程序僅處於空閒狀態,並等待Windows事件 。如果 您正在使用GUI工具包(例如, wxPython),則此循環不是必需的,因爲該工具包提供了它自己的循環。

2

窗口的做法是處理WM_LBUTTONDBLCLK消息。

要發送此類窗口,需要使用CS_DBLCLKS類樣式創建窗口類。

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

4

可以使用Mark Hammond的Python for Windows extensions通過python訪問Windows MFC,包括GUI編程。 An O'Reilly Book Excerpt從哈蒙德和羅賓遜的book展示瞭如何掛鉤鼠標消息,.e.g:

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

原料MFC是不容易的或明顯的,但尋找Python示例網站可能會產生一些可用的例子。

10

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

這是一個炎熱分鐘,因爲這個問題被問,但我想我會分享我的解決方案:我只是用內置模塊​​。 (我正在使用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