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

2024-09-30 16:40:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我引用的是这个旧的线索: system wide shortcut for Mac OS X

自从我以前使用pyglobalshortcuts的方法不再适用于PyQt5之后,我一直试图使用这个方法为osx创建一个全局热键。 问题是,当我在“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, "<<<<<<<<<<<<<<<"

我还试着替换石英。kCGEventMaskBit(石英。kCGEventKeyUp)'与'石英。kCGEventMaskForAllEvents'虽然这没有失败,但它也没有返回任何字母数字键(我需要能够使用'ctrl+shift+d'作为快捷方式)。在

我是不是离能够在Quartz中检测到这个快捷方式还差得很远呢,还是OSX中有更好的方法呢?在

谢谢, -马克


Tags: 方法代码importnoneeventtapprintquartz