Voo*_*Voo 3 python macos qt pyqt objective-c
因此我被要求将一些内部帮助应用程序移植到Mac OS X 10.7.
因为平台相关代码无论如何都很小,但是一个应用程序需要一个系统范围的快捷方式来运行(即RegisterHotkey功能)而且我找不到任何关于如何在Mac上执行此操作的文档.
该程序使用PyQt gui和Python 3.2.而windows的相应代码基本上是:
def register_hotkey(self):
hwnd = int(self.winId())
modifiers, key = self._get_hotkey()
user32.RegisterHotKey(hwnd, self._MESSAGE_ID, modifiers, key)
Run Code Online (Sandbox Code Playgroud)
然后接收热键事件:
def winEvent(self, msg):
if msg.message == w32.WM_HOTKEY:
self.handle_hotkey()
return True, id(msg)
return False, id(msg)
Run Code Online (Sandbox Code Playgroud)
请注意,我不需要python变体,我可以轻松编写一个简单的c扩展 - 所以C/objective-c解决方案也是受欢迎的.
我最近编写了一个扩展到quodlibet捕获多媒体键(因为吸收到quodlibet本身); 对于您的设置,适用相同的过程.
我使用Quartz CGEventTapCreate钩子和事件循环,以及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()
Run Code Online (Sandbox Code Playgroud)
我为系统定义的键定义了一个tap(媒体键); 你必须指定一个不同的事件掩码(CGEventMaskBit带有一个或多个事件类型); 例如,Quartz.CGEventMaskBit(Quartz.kCGEventKeyUp)用于关键事件.
回调应具有以下签名(它实现CGEventTapCallBackQuartz API中的方法:
def keyboardTapCallback(proxy, type_, event, refcon):
# Convert the Quartz CGEvent into something more useful
keyEvent = NSEvent.eventWithCGEvent_(event)
Run Code Online (Sandbox Code Playgroud)
我将Quartz事件转换为a NSEvent,因为我在Mac多媒体键上找到的所有信息都是指那个类.
原则上你也可以用AppKit API实现同样的功能,但是你的Python应用程序被视为Mac应用程序(在Dock中可以看到带有图标和所有内容),而我希望将它保存在后台.
| 归档时间: |
|
| 查看次数: |
1976 次 |
| 最近记录: |