سؤال

كيف يمكنني اكتشاف نقرات الماوس بغض النظر عن النافذة التي يوجد فيها الماوس؟

Perferabliy في Python ، ولكن إذا تمكن شخص ما من شرح ذلك في أي langauge ، فقد أتمكن من اكتشاف ذلك.

لقد وجدت هذا على موقع Microsoft:http://msdn.microsoft.com/en-us/library/ms645533(vs.85).aspx

لكنني لا أرى كيف يمكنني اكتشاف أو التقاط الإخطارات المدرجة.

حاول استخدام وظيفة pygame.mouse.get_pos () Pygame على النحو التالي:

import pygame
pygame.init()
while True:
    print pygame.mouse.get_pos()

هذا يعود فقط 0،0. لست على دراية ببيجام ، هل شيء مفقود؟

في أي حال ، أفضل طريقة دون الحاجة إلى تثبيت وحدة الطرف الثالث. (بخلاف Pywin32 http://sourceforge.net/projects/pywin32/ )

هل كانت مفيدة؟

المحلول

الطريقة الوحيدة لاكتشاف أحداث الماوس خارج البرنامج هي تثبيت خطاف Windows باستخدام Setwindowshookex. ال بيهوك الوحدة النمطية تغلف التفاصيل الدقيقة. إليك عينة ستطبع موقع كل ماوس:

import pyHook
import pythoncom

def onclick(event):
    print event.Position
    return True

hm = pyHook.HookManager()
hm.SubscribeMouseAllButtonsDown(onclick)
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()

يمكنك التحقق من مثال البرنامج النصي المثبت مع الوحدة لمزيد من المعلومات حول حدث معامل.

قد يكون Pyhook صعبًا في استخدامه في نص Python النقي ، لأنه يتطلب مضخة رسائل نشطة. من الدورة التعليمية:

يجب أن يحتوي أي تطبيق يرغب في تلقي إشعارات أحداث الإدخال العالمية على مضخة رسائل Windows. أسهل طريقة للحصول على واحدة من هذه هي استخدام طريقة Pumpmessages في حزمة Extensions Win32 لـ Python. [...] عند التشغيل ، يجلس هذا البرنامج فقط وينتظر أحداث Windows. إذا كنت تستخدم مجموعة أدوات واجهة المستخدم الرسومية (مثل Wxpython) ، فإن هذه الحلقة غير ضرورية لأن مجموعة الأدوات توفرها.

نصائح أخرى

أنا استخدم win32api. إنه يعمل عند النقر على أي Windows.

# 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)

يمكن الوصول إلى Windows MFC ، بما في ذلك برمجة واجهة المستخدم الرسومية ، مع Python باستخدام بيثون لتمديدات Windows بقلم مارك هاموند. مقتطف من كتاب أورايلي من Hammond's و Robinson's الكتاب يوضح كيفية ربط رسائل الماوس ، .EG:

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

RAW MFC ليس بالأمر السهل أو الواضح ، ولكن البحث عن الويب عن أمثلة Python قد يؤدي إلى بعض الأمثلة القابلة للاستخدام.

لقد كانت دقيقة ساخنة منذ طرح هذا السؤال ، لكنني اعتقدت أنني سأشارك حللي: لقد استخدمت للتو الوحدة النمطية المدمجة 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

طريقة Windows للقيام بذلك هي التعامل مع WM_LBUTTONDBLCLK رسالة.

لكي يتم إرسال هذا ، يجب إنشاء فئة النافذة الخاصة بك مع CS_DBLCLKS نمط الفصل.

أخشى أنني لا أعرف كيفية تطبيق هذا في بيثون ، ولكن آمل أن يمنحك بعض التلميحات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top