使用 pyobjc 为 Python 中的 OSX 编程全局热键检测——使用 'Quartz.CGEventMaskBit' 时出错

Programming global hotkey detection for OSX in Python using pyobjc -- Error using 'Quartz.CGEventMaskBit'

我引用了这个旧线程: system wide shortcut for Mac OS X

我一直在尝试使用它为 osx 创建全局热键,因为我使用 pyglobalshortcuts 的旧方法不再适用于 PyQt5。 问题是,当我在 'CGEventTapCreate' 函数中监听 'kCGEventKeyUp' 或 'kCGEventKeyDown' 时,程序以代码“-11”退出。 这是我尝试的代码:

import Quartz
from AppKit import NSKeyUp, NSSystemDefined, NSEvent

def keyboardTapCallback(proxy, type_, event, refcon):
    keyEvent = NSEvent.eventWithCGEvent_(event)
    if keyEvent is None:
        pass
    else:
        print keyEvent


tap = Quartz.CGEventTapCreate(
                              Quartz.kCGSessionEventTap,
                              Quartz.kCGHeadInsertEventTap,
                              Quartz.kCGEventTapOptionListenOnly,
                              # Quartz.kCGEventMaskForAllEvents, 
                              Quartz.CGEventMaskBit(Quartz.kCGEventKeyUp),
                              keyboardTapCallback,
                              None
                             )


runLoopSource = Quartz.CFMachPortCreateRunLoopSource(None, tap, 0)
Quartz.CFRunLoopAddSource(
                          Quartz.CFRunLoopGetCurrent(),
                          runLoopSource,
                          Quartz.kCFRunLoopDefaultMode
                         )

Quartz.CGEventTapEnable(tap, True)

try:
    Quartz.CFRunLoopRun()
except Exception as e:
    print e, "<<<<<<<<<<<<<<<"

我也尝试用 'Quartz.kCGEventMaskForAllEvents' 替换 'Quartz.kCGEventMaskBit(Quartz.kCGEventKeyUp)' 虽然这没有失败,但它也没有返回任何字母数字键(我需要能够使用 'ctrl+shift+d' 作为我的捷径)。

我是否能够在 Quartz 中检测到此快捷方式,或者 OSX 中是否有更好的方法?

谢谢, -马克

我想我刚刚弄明白了。我通过 Synergy 使用共享键盘。当我回到 mac 键盘时,它可以检测到按键事件。

谢谢! -马克