2011-01-15 11 views
5

Ich versuche zu lernen, für den Mac zu programmieren. Ich bin seit einiger Zeit ein Java-Typ, also hoffe ich, dass das Problem, auf das ich stoße, ein einfaches Missverständnis von Cocoa ist.addGlobalMonitorForEventsMatchingMask gibt nur die Mausposition zurück

Ich habe den folgenden Code bekommt:

-(IBAction)beginEventMonitor:(id)sender { 
    _eventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseUpMask) 
    handler:^(NSEvent *incomingEvent) { 
    //NSWindow *targetWindowForEvent = [incomingEvent window]; 
    NSLog(@"Got a mouse click event at %@", NSStringFromPoint([incomingEvent locationInWindow])); 
    }]; 
} 

-(IBAction)stopEventMonitor:(id)sender { 
    if (_eventMonitor) { 
    [NSEvent removeMonitor:_eventMonitor]; 
    _eventMonitor = nil; 
    } 
} 

Dies ist ein einfacher Haken, mir zu sagen, wenn ein Mausklick auf globaler Ebene geschieht. Der Handler funktioniert, aber der Inhalt von incomingEvent scheint auf nichts eingestellt zu sein. Die einzige nützliche Information, die ich finden kann, ist die Position der Maus zum Zeitpunkt des Klicks und die Fenster-ID des geklickten Fensters.

Sollte ich nicht mehr Informationen bekommen? Richte ich den Monitor nicht richtig ein? Ich würde gerne wissen wollen, in welchem ​​Fenster geklickt wurde, aber ich finde nicht einmal eine Möglichkeit, die Mausposition oder Fenster-ID in etwas Nützliches zu verwandeln.

Antwort

6

Sie können mehr Informationen über das Fenster abrufen unter Verwendung des CGWindow APIs (neu in Leopard), zum Beispiel: zur Verfügung, die docs

CGWindowID windowID = (CGWindowID)[incomingEvent windowNumber]; 
CFArrayRef a = CFArrayCreate(NULL, (void *)&windowID, 1, NULL); 
NSArray *windowInfos = (NSArray *)CGWindowListCreateDescriptionFromArray(a); 
CFRelease(a); 
if ([windowInfos count] > 0) { 
    NSDictionary *windowInfo = [windowInfos objectAtIndex:0]; 
    NSLog(@"Name: %@", [windowInfo objectForKey:(NSString *)kCGWindowName]); 
    NSLog(@"Owner: %@", [windowInfo objectForKey:(NSString *)kCGWindowOwnerName]); 
    //etc. 
} 
[windowInfos release]; 

Es gibt viele Informationen gibt (Blick in CGWindow.h oder verweisen Schlüssel). Es gibt auch Funktionen, um Screenshots von nur einem Fenster zu erstellen (was auch funktioniert, wenn es teilweise von einem anderen Fenster abgedeckt wird), cooles Zeug!

+0

funktioniert gut mit Mausereignissen, wissen Sie etwas für keyDown-Ereignisse? –

Verwandte Themen