使用 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 键盘时,它可以检测到按键事件。
谢谢!
-马克
我引用了这个旧线程: 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 键盘时,它可以检测到按键事件。
谢谢! -马克