如何在Mac OS X上的Python .app中实现全局热键?

时间:2011-03-29 09:34:22

标签: python objective-c cocoa macos-carbon hotkeys

我目前正在修改由我的组织内的人员编写的应用程序,该应用程序无法再维护它。我正在尝试实现一个系统范围的全局热键,只需按下即可使应用程序窗口成为焦点。

我在网上遇到的唯一一个实现是通过PyObjC的HotKeyPython示例。这个例子虽然使用了Carbon,但在我测试时它似乎根本没有用。

以下是我尝试的内容似乎不起作用:

from Foundation import *
from AppKit import *
from Carbon.CarbonEvt import RegisterEventHotKey
from Carbon.Events import cmdKey, controlKey, optionKey, shiftKey
import objc, AppLauncher
import platform
import struct
IS_SNOW_LEOPARD = platform.mac_ver()[0].startswith('10.6')
if IS_SNOW_LEOPARD:
  from Quartz import *

kEventHotKeyPressedSubtype = 6
kEventHotKeyReleasedSubtype = 9


class AppLauncher(NSObject):
  window = objc.IBOutlet()
  view = objc.IBOutlet()
  field = objc.IBOutlet()


  def awakeFromNib(self):
    self.window.makeFirstResponder_(self.field)
    self.field.selectText_(self)
    self.field.setDelegate_(self)
    self.controlTextDidChange_(None)

    def applicationDidFinishLaunching(self):
        # register cmd-control-J
        self.hotKeyRef = RegisterEventHotKey(38, cmdKey + controlKey, (0, 0),
                                             sendEvent_(), 0)

    def sendEvent_(self, theEvent):
        if theEvent.type() == NSSystemDefined and \
               theEvent.subtype() == kEventHotKeyPressedSubtype:
            self.activateIgnoringOtherApps_(True)
            NSRunAlertPanel(u'Hot Key Pressed', u'Hot Key Pressed',
                None, None, None)
        super(AppLauncher, self).sendEvent_(theEvent)

关于如何让这个工作的任何想法(最好不要让碳参与)?

非常感谢。

0 个答案:

没有答案