2016-04-18 33 views
5

Sto tentando di ricevere una notifica quando un utente di OS X sta trascinando qualsiasi file in OS X, non solo nella mia app.Registrati per eventi di trascinamento di file globali in Cocoa

mio approccio attuale stava usando addGlobalMonitorForEventsMatchingMask:handler: su NSEvent, come segue:

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

questo funziona parzialmente - il gestore viene chiamato quando inizio trascinando un file dal desktop o dal Finder, ma anche viene chiamato quando eseguo ogni altra operazione che contiene il trascinamento del mouse sinistro, ad es spostare una finestra. Il problema è che il NSDragPboard sembra ancora contenere l'ultimo URL di file trascinato, ad es. quando lascio il file e inizio a spostare una finestra, il che rende difficile distinguere tra queste operazioni.

TL; DR - Sono interessato alle operazioni di trascinamento dei file in tutto il sistema. Non ho bisogno di informazioni sul file trascinato, solo le informazioni che l'operazione di trascinamento del file è stata avviata o interrotta. Gradirei qualsiasi suggerimento su una possibile soluzione per questa domanda.

risposta

2

Dopo aver parlato con Apple DTS, questo è probabilmente un bug. Ho archiviato rdar://25892115 per questo problema. Al momento non sembra esserci alcun modo per risolvere la mia domanda originale con l'API fornita.

Per risolvere il mio problema, ora sto usando l'API di accessibilità per capire se l'elemento sotto il cursore è un file (kAXFilenameAttribute non è NULL).