python - Mac OS X 的系统级快捷方式

标签 python objective-c macos qt pyqt

所以我被要求将一些内部帮助应用程序移植到 Mac OS X 10.7。

工作得很好,因为依赖于平台的代码无论如何都是最少的,但是一个应用程序需要一个系统范围的快捷方式才能运行(即 RegisterHotkey 功能),我找不到任何关于我如何在麦克。

该程序在 Python 3.2 中使用 PyQt gui。 windows对应的代码基本上是:

def register_hotkey(self):
    hwnd = int(self.winId())
    modifiers, key = self._get_hotkey()
    user32.RegisterHotKey(hwnd, self._MESSAGE_ID, modifiers, key)

然后接收热键事件:

def winEvent(self, msg):
    if msg.message == w32.WM_HOTKEY:
        self.handle_hotkey()
        return True, id(msg)
    return False, id(msg)

请注意,我不需要 python 变体,我可以轻松编写一个简单的 c 扩展 - 所以 C/objective-c 解决方案也很受欢迎。

最佳答案

我最近编写了一个 extensionquodlibet捕获多媒体 key (因为被吸收到 quodlibet 本身);对于您的设置,同样的过程适用。

我用的是 Quartz CGEventTapCreate hook和事件循环,以及用于破译关键代码的 Cocoa AppKit 框架。

下面的代码注册了一个 python 回调,它被传递给全局按键,并启动事件循环:

import Quartz
from AppKit import NSKeyUp, NSSystemDefined, NSEvent

# Set up a tap, with type of tap, location, options and event mask
tap = Quartz.CGEventTapCreate(
    Quartz.kCGSessionEventTap, # Session level is enough for our needs
    Quartz.kCGHeadInsertEventTap, # Insert wherever, we do not filter
    Quartz.kCGEventTapOptionListenOnly, # Listening is enough
    Quartz.CGEventMaskBit(NSSystemDefined), # NSSystemDefined for media keys
    keyboardTapCallback,
    None
)

runLoopSource = Quartz.CFMachPortCreateRunLoopSource(None, tap, 0)
Quartz.CFRunLoopAddSource(
    Quartz.CFRunLoopGetCurrent(),
    runLoopSource,
    Quartz.kCFRunLoopDefaultMode
)
# Enable the tap
Quartz.CGEventTapEnable(tap, True)
# and run! This won't return until we exit or are terminated.
Quartz.CFRunLoopRun()

我只为系统定义的键(媒体键)定义了一个点击;您必须指定不同的事件掩码(CGEventMaskBit 带有一个或多个 Event Types);例如Quartz.CGEventMaskBit(Quartz.kCGEventKeyUp) 用于按键事件。

回调应具有以下签名(它实现了 CGEventTapCallBack method from the Quartz API :

def keyboardTapCallback(proxy, type_, event, refcon):
    # Convert the Quartz CGEvent into something more useful
    keyEvent = NSEvent.eventWithCGEvent_(event)

我将 Quartz 事件转换为 NSEvent ,因为我能在 Mac 多媒体键上找到的所有信息都指的是那个类。

原则上,您也可以使用 AppKit API 实现相同的目的,但随后您的 Python 应用程序将被视为 Mac 应用程序(在 Dock 中可见,带有图标和所有内容),而我希望将其保留在后台完全。

关于python - Mac OS X 的系统级快捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11347862/

相关文章:

Python 从类中定义的不同文件调用方法

iOS:使用 MVC 实现 UITableView

android - Build OS X需要太多时间

python - Django admin 中的间接内联

python - Pandas 数据帧到张量

objective-c - 如何重定向 URL 以在 ios 应用程序中的 puffin 浏览器而不是 safari 浏览器中打开?

macos - Mac 上的 wkhtmltopdf - 它是如何执行的?

swift - 缩放 NSTextView 并在 Swift 2 中保留自动换行

python - 在 QTreeView 中获取当前选中的项目

ios - 编辑它的属性后将 nsobject 自定义类复制到数组