簡體   English   中英

如何在Mac上用Python監聽鼠標事件?

[英]How can I listen for a mouse event in Python on Mac?

我需要在用Python編寫的應用程序中監聽Mac上的全局鼠標事件(未綁定到應用程序)。

我正在使用PyObjC,但我無法弄清楚如何做到這一點。 簡單的ObjC示例或其他Python技術也很受歡迎。

我的代碼到目前為止:

from Quartz import *
def MyFunction(proxy, type, event):
    print event

CGEventTapCreate(kCGHIDEventTap, kCGTailAppendEventTap, kCGEventTapOptionListenOnly, kCGEventLeftMouseDown, MyFunction)

==分段錯誤

我知道我需要稍后將它添加到事件源中,但我需要首先使用它。

[更新]

使用PyObjC形式Macports解決了段錯誤,所以現在我寫了這個:

from Quartz import *

def MyFunction(p, t, e, c):
    print e

tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, kCGEventLeftMouseDown, MyFunction, None)

runLoopSource = CFMachPortCreateRunLoopSource(None, tap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopDefaultMode);
CGEventTapEnable(tap, True);

CFRunLoopRun();

但這只是永遠運行而且不響應鼠標事件,有什么不對?

CGEventTapCreate的第四個參數是CGEventMask eventsOfInterest ,你給它kCGEventLeftMouseDown ,它是_CGEventType類型的枚舉。 您需要翻轉位掩碼中的相應位,而不是整數常量。 您可以使用CGEventMaskBit執行此操作

所以不是這樣的:

tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
    kCGEventTapOptionListenOnly, kCGEventLeftMouseDown, MyFunction, None)

我們做得到:

tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
    kCGEventTapOptionListenOnly, CGEventMaskBit(kCGEventLeftMouseDown),
    MyFunction, None)

或等效地:

tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
    kCGEventTapOptionListenOnly, (1 << kCGEventLeftMouseDown),
    MyFunction, None)

CGEventTapCreatehttp://developer.apple.com/mac/library/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventTapCreate )的文檔說你需要是root用戶使用kCGHIDEventTap。 您是否以root身份運行腳本? (sudo是一種方法)

如果是,你還應該檢查tap是否為None; 這將有助於縮小問題范圍。 文檔中列出的幾個錯誤條件可能導致CGEventTapCreate返回NULL,這在Python中應反映為None。

首先, CGEventTapCreateCGEventTapCreateForPSN在調用它們時會泄漏一些內存。 這是避免內存管理問題所必需的。 因此建議不要調用這些函數,至少要調用它們很少次。

現在,鼠標事件的工作原理如下:

evt = CGEventCreateMouseEvent(None, kCGEventLeftMouseDown, (80, 90), kCGMouseButtonLeft)
self.failUnlessIsInstance(evt, CGEventRef)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM