Вы были на правильном пути с NSEvent
! Если вы не хотите изменять событие, а просто наблюдать за ним, это так же просто, как вызвать addGlobalMonitorForEventsMatchingMask:handler:
. Ваше приложение будет получать уведомления с помощью обратного вызова всякий раз, когда событие указанного вами типа с маской публикуется в другом приложении. * Аргумент обработчика является блоком, но вам не нужно беспокоиться, потому что аргументы блока в PyObjC работать легче, чем в обычном Obj-C: вы можете передать любой вызываемый объект (функцию, метод, класс и т. д.), а мост обработает все остальное. Это все, что вам нужно сделать:
def callback(event):
NSLog(u"%s" % event)
NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSScrollWheelMask, callback)
В обратном вызове вы получаете копию фактического события, которое вы можете запросить для таких вещей, как deltaX
или что угодно.
Обратите внимание, что, подобно многим другим интересным методам в AppKit, этот новый появился в 10.6 и отсутствует в файле метаданных для более старых (читай: от Apple) версий PyObjC. Это означает, что если вы попытаетесь построить приложение, используя установку моста по умолчанию, это не удастся. Вам придется использовать более новую версию.
* Если вы хотите получать события, публикуемые в вашем приложении, вы должны использовать addLocalMonitorForEventsMatchingMask:handler:
. К сожалению, один монитор событий не может получить как события для вашего приложения, так и для других.