2008-10-03 32 views
16

का उपयोग कर विंडोज़ में माउस क्लिक का पता लगाना माउस की खिड़की के बावजूद मैं माउस क्लिक का पता कैसे लगा सकता हूं?पाइथन

पायथन में पेरफेरबेल, लेकिन अगर कोई इसे किसी भी लंगेज में समझा सकता है तो मैं इसे समझने में सक्षम हो सकता हूं।

मैं माइक्रोसॉफ्ट की साइट पर इस पाया: 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 टूलकिट/लाइब्रेरी का उपयोग कर रहे हैं? –

+2

मुझे लगता है कि Win32ui और ctypes का उपयोग करके यह संभव होना चाहिए। मैंने पाया कि मैं windll.user32.GetCursorPos (पॉइंटर (pt_struct)) के साथ माउस स्थिति प्राप्त कर सकता हूं (विवरण के लिए: http://monkut.webfactional.com/blog/archive/2008/10/2/python-win-mouse -पॉजिशन) – monkut

उत्तर

29

अपने प्रोग्राम के बाहर माउस ईवेंट का पता लगाने का एकमात्र तरीका SetWindowsHookEx का उपयोग कर एक विंडोज हुक स्थापित करना है। pyHook मॉड्यूल नट-किरकिरा विवरण encapsulates। यहां एक नमूना है कि हर माउस क्लिक के स्थान प्रिंट होगा है:

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 स्क्रिप्ट घटना पैरामीटर के बारे में अधिक जानकारी के लिए मॉड्यूल के साथ स्थापित किया गया है देख सकते हैं।

पाइहुक शुद्ध पायथन लिपि में उपयोग करने में मुश्किल हो सकता है, क्योंकि इसे एक सक्रिय संदेश पंप की आवश्यकता होती है। tutorial से:

कि वैश्विक इनपुट ईवेंट की सूचनाएँ प्राप्त करने के लिए Windows संदेश पंप होना आवश्यक है चाहता है किसी भी आवेदन। इनमें से एक प्राप्त करने का सबसे आसान तरीका पायथन के लिए Win32 एक्सटेंशन पैकेज में PumpMessages विधि का उपयोग करें। [...] चलाने पर, यह प्रोग्राम बस निष्क्रिय रहता है और विंडोज़ ईवेंट के लिए इंतजार कर रहा है। यदि आप एक GUI टूलकिट (उदा। wxPython) का उपयोग कर रहे हैं, तो यह लूप अनावश्यक है क्योंकि टूलकिट अपना स्वयं का प्रदान करता है।

+0

ध्यान दें कि PyHook इस समय लगभग https://sourceforge.net/projects/pyhook/ –

+0

पर स्थानांतरित हो गया है यदि आप 'ctypes' लाइब्रेरी आयात करना चाहते हैं और फिर वर्तमान धागे में कहीं भी निष्पादित करना चाहते हैं: ' ctypes.windll.user32.PostQuitMessage (0) ' यह 'pythoncom.PumpMessages()' –

2

यह WM_LBUTTONDBLCLK संदेश को संभालने के लिए है कर की खिड़कियों रास्ता।

इसे भेजने के लिए, आपकी विंडो कक्षा CS_DBLCLKS कक्षा शैली के साथ बनाई जानी चाहिए।

मुझे डर है कि मुझे नहीं पता कि पाइथन में इसे कैसे लागू किया जाए, लेकिन उम्मीद है कि यह आपको कुछ संकेत दे सकता है।

4

जीयूआई प्रोग्रामिंग समेत विंडोज एमएफसी, मार्क हैमंड द्वारा Python for Windows extensions का उपयोग करके अजगर के साथ सुलभ है।

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

कच्चे MFC आसान या स्पष्ट नहीं है, लेकिन अजगर उदाहरण के लिए वेब की खोज कुछ प्रयोग करने योग्य उदाहरण उपज सकता है: An O'Reilly Book Excerpt हेमंड के और रॉबिन्सन book से माउस संदेश, .e.g हुक करने के लिए कैसे पता चलता है।

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

यह एक गर्म मिनट हो गया है के बाद से इस प्रश्न पूछा गया था, लेकिन मैंने सोचा था कि मैं अपने समाधान का हिस्सा हैं: मैं सिर्फ इस्तेमाल किया निर्मित मॉड्यूल ctypes। (मैं पाइथन 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