在Cocoa中注册全局文件拖动事件

Tim*_*ten 5 macos cocoa drag-and-drop macos-carbon nsevent

我正在尝试在OS X用户拖动OS X中的任何文件时收到通知,而不仅仅是在我的应用程序中.

我目前的做法是使用addGlobalMonitorForEventsMatchingMask:handler:NSEvent,具体如下:

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

这部分工作 - 当我开始从桌面或Finder中拖动文件时调用处理程序,但是当我执行包含鼠标左键拖动的所有其他操作(例如移动窗口)时也会调用它.问题是NSDragPboard仍然似乎包含最新的拖动文件URL,例如当我放开文件并开始移动窗口时,这使得很难区分这些操作.

TL; DR - 我对系统范围内的文件拖动操作感兴趣.我不需要有关拖动文件本身的任何信息,只需要文件拖动操作已启动或停止的信息.我将不胜感激任何暗示这个问题的可能解决方案.

Tim*_*ten 2

与 Apple DTS 交谈后,这很可能是一个错误。我已针对此问题提交了rdar://25892115 。目前似乎无法使用给定的 API 来解决我最初的问题。

为了解决我的问题,我现在使用 Accessibility API 来确定光标下方的项目是否是一个文件(kAXFilenameAttribute 不为 NULL)。