[Pyobjc-dev] unexpected error
Brought to you by:
ronaldoussoren
From: Eric Le L. <ker...@us...> - 2014-10-08 10:48:48
|
Hello list, I've encountered a problem when trying to register and event tap: The error occurs when calling loop.addPort_forMode_(port, NSDefaultRunLoopMode) in test_app.py, included below. Can someone see what I'm doing wrong? My code is an adaptation of the first response in http://forums.macrumors.com/showthread.php?t=1145465 The objective-c version does work. Thanks, Eric ________________ test_app.py ___________________________ #Traceback (most recent call last): # File "/Users/elelay/Desktop/test_app.py", line 35, in <module> # eventTap.runEventsCapture() # File "/Users/elelay/Desktop/test_app.py", line 30, in runEventsCapture # loop.addPort_forMode_(port, NSDefaultRunLoopMode) # ValueError: NSInvalidArgumentException - *** -scheduleInRunLoop:forMode: cannot be sent to an abstract object of class NSMachPort: Create a concrete instance! # from AppKit import NSSystemDefined, NSApp import Quartz from CoreFoundation import CFMachPortGetPort from Foundation import NSMachPortDeallocateNone, \ NSRunLoop, NSDefaultRunLoopMode, \ NSMachPort class MacKeyEventsTap(object): def __init__(self): pass def eventTap(self, proxy, type_, event, refcon): print("eventTap()") return event def runEventsCapture(self): tap = Quartz.CGEventTapCreate( Quartz.kCGSessionEventTap, Quartz.kCGHeadInsertEventTap, Quartz.kCGEventTapOptionDefault, # NSSystemDefined for media keys Quartz.CGEventMaskBit(NSSystemDefined), self.eventTap, None ) port = NSMachPort.alloc().initWithMachPort_options_(CFMachPortGetPort(tap), NSMachPortDeallocateNone) loop = NSRunLoop.currentRunLoop() loop.addPort_forMode_(port, NSDefaultRunLoopMode) NSApp.run() if __name__ == '__main__': eventTap = MacKeyEventsTap() eventTap.runEventsCapture() |