Как использовать Mac OS X NSEvents в приложении wxPython?

Я пишу приложение, которое должно реагировать на общесистемные нажатия клавиш в Mac OS X.

Итак, я нашел несколько примеров кейлоггеров, которые должны работать, и врезались в стену, потому что все примеры основаны на NSSharedApplication() и PyObjC AppHelper.runEventLoop(), а мое приложение написано на wxPython.

Здесь я публикую модификацию самого простого примера из https://github.com/ljos, который, как я думал, должен работать. . Но это не так.

from AppKit import *
import wx

class AppDelegate(NSObject):
    def applicationDidFinishLaunching_(self, aNotification):
        NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSKeyDownMask, handler)

def handler(event):
    print (u"%@", event)

app = wx.App()
delegate = AppDelegate.alloc().init()
NSApp().setDelegate_(delegate)
app.MainLoop()

Очевидно, что MainLoop() не перехватывает делегированные NSEvents.

После app = wx.App() NSApp() возвращается правильно. Так почему это не работает? Как заставить это работать?


person Dalen    schedule 11.10.2016    source источник


Ответы (1)


Так как никто не ответил, я стал искать вокруг под другим углом зрения.

Итак, я обнаружил, что модуль Quartz можно использовать для доступа к событиям клавиатуры и мыши. Пользовательский цикл не требуется, поэтому wx.App() и wx.App.MainLoop() не мешают.

Я также нашел хороший пакет под названием pynput, который делает это за меня, что сэкономит мне много времени. Кварц довольно сложен, много зашифрованных имен функций и констант. Но это делает хорошую работу.

person Dalen    schedule 14.10.2016