gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:55:12 25 4
gpt4 key购买 nike

所以我被要求将一些内部帮助应用程序移植到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com