如何在Mac上用Python监听鼠标事件?

Pep*_*ijn 9 python pyobjc objective-c mouseevent

我需要在用Python编写的应用程序中监听Mac上的全局鼠标事件(未绑定到应用程序).

我正在使用PyObjC,但我无法弄清楚如何做到这一点.简单的ObjC示例或其他Python技术也很受欢迎.

我的代码到目前为止:

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

CGEventTapCreate(kCGHIDEventTap, kCGTailAppendEventTap, kCGEventTapOptionListenOnly, kCGEventLeftMouseDown, MyFunction)
Run Code Online (Sandbox Code Playgroud)

==分段错误

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

[更新]

使用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();
Run Code Online (Sandbox Code Playgroud)

但这只是永远运行而且不响应鼠标事件,有什么不对?

Fel*_*ung 3

CGEventTapCreate 的第四个参数是CGEventMask eventsOfInterest,您给它的kCGEventLeftMouseDown是一个类型为 的枚举_CGEventType。您需要翻转位掩码中的相应位,而不是整数常量。您可以使用以下方法执行此操作CGEventMaskBit

所以代替这个:

tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
    kCGEventTapOptionListenOnly, kCGEventLeftMouseDown, MyFunction, None)
Run Code Online (Sandbox Code Playgroud)

我们做得到:

tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
    kCGEventTapOptionListenOnly, CGEventMaskBit(kCGEventLeftMouseDown),
    MyFunction, None)
Run Code Online (Sandbox Code Playgroud)

或等价:

tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
    kCGEventTapOptionListenOnly, (1 << kCGEventLeftMouseDown),
    MyFunction, None)
Run Code Online (Sandbox Code Playgroud)