2016-04-18 22 views
5

Ich versuche, benachrichtigt werden, wenn ein OS X-Benutzer eine beliebige Datei in OS X zieht, nicht nur in meiner App.Registrieren für globale Datei ziehen Ereignisse in Cocoa

Mein aktueller Ansatz wurde mit addGlobalMonitorForEventsMatchingMask:handler: auf NSEvent wie folgt:

[NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDraggedMask handler:^(NSEvent* event) { 
    NSPasteboard* pb = [NSPasteboard pasteboardWithName:NSDragPboard]; 
    NSLog(@"%@", [pb propertyListForType:NSFilenamesPboardType]); 
}]; 

Dies funktioniert zum Teil - die Handler aufgerufen wird, wenn ich eine Datei von meinem Desktop oder Finder starten ziehen, aber es auch genannt wird, wenn ich jede andere Operation, die eine linke Maustaste enthält, z ein Fenster verschieben. Das Problem ist, dass die NSDragPboard immer noch die letzte URL der gezogenen Datei zu enthalten scheint, z. Wenn ich die Datei loslasse und ein Fenster verschiebe, ist es schwierig, zwischen diesen Vorgängen zu unterscheiden.

TL; DR - Ich interessiere mich für Datei ziehen Operationen systemweit. Ich brauche keine Informationen über die gezogene Datei selbst, sondern nur die Information, dass ein Datei-Drag-Vorgang gestartet oder gestoppt wurde. Ich würde mich über jeden Hinweis auf eine mögliche Lösung für diese Frage freuen.

Antwort

2

Nach dem Gespräch mit Apple DTS ist dies wahrscheinlich ein Fehler. Ich habe rdar://25892115 für dieses Problem eingereicht. Momentan scheint es keine Möglichkeit zu geben, meine ursprüngliche Frage mit der gegebenen API zu lösen.

Um mein Problem zu lösen, verwende ich jetzt die Accessibility API, um herauszufinden, ob das Element unter dem Cursor eine Datei ist (kAXFilenameAttribute ist nicht NULL).