[英]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)
CGEventTapCreate ( http://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。
首先, CGEventTapCreate和CGEventTapCreateForPSN在調用它們時會泄漏一些內存。 這是避免內存管理問題所必需的。 因此建議不要調用這些函數,至少要調用它們很少次。
現在,鼠標事件的工作原理如下:
evt = CGEventCreateMouseEvent(None, kCGEventLeftMouseDown, (80, 90), kCGMouseButtonLeft)
self.failUnlessIsInstance(evt, CGEventRef)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.