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

Macos 在Cocoa中注册全局文件拖动事件,macos,cocoa,drag-and-drop,macos-carbon,nsevent,Macos,Cocoa,Drag And Drop,Macos Carbon,Nsevent,当OS X用户在OS X中拖动任何文件时,我试图得到通知,而不仅仅是在我的应用程序中 我当前的方法是在NSEvent上使用addGlobalMonitorForEventsMatchingMask:handler:,如下所示: [NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDraggedMask handler:^(NSEvent* event) { NSPasteboard* pb = [NSPasteboard p

当OS X用户在OS X中拖动任何文件时,我试图得到通知,而不仅仅是在我的应用程序中

我当前的方法是在
NSEvent
上使用
addGlobalMonitorForEventsMatchingMask:handler:
,如下所示:

[NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDraggedMask handler:^(NSEvent* event) {
    NSPasteboard* pb = [NSPasteboard pasteboardWithName:NSDragPboard];
    NSLog(@"%@", [pb propertyListForType:NSFilenamesPboardType]);
}];
这部分起作用-当我开始从桌面或Finder拖动文件时,会调用处理程序,但当我执行其他包含鼠标左键拖动的操作(例如移动窗口)时,也会调用处理程序。问题在于
NSDragPboard
似乎仍然包含最新的拖动文件URL,例如,当我放下文件并开始移动窗口时,这使得很难区分这些操作


TL;DR-我对系统范围内的文件拖动操作感兴趣。我不需要关于被拖动文件本身的任何信息,只需要文件拖动操作已启动或停止的信息。我希望您能给我一些提示,为这个问题提供一个可能的解决方案。

在与Apple DTS交谈之后,这很可能是一个bug。我已经申请了这个问题。目前似乎没有办法用给定的API解决我最初的问题


为了解决我的问题,我现在使用可访问性API来确定光标下面的项是否是文件(kAXFilenameAttribute不为NULL)

你能解释一下代码吗?//当拖动一个文件时,拖动的粘贴板包含文件名并且pb.changeCount已更改,现在拖动一个窗口而不是文件,pb中的文件名仍然包含,重要的changeCount不是更改,你使用它区分是否(filenames.count>0&&self.lastChangeCount!=changeCount){self.lastChangeCount=changeCount;//这里的代码}这似乎工作得很好,不需要使用可访问性API。谢谢!
NSPasteboard* pb = [NSPasteboard pasteboardWithName:NSDragPboard];
NSArray* filenames = [pb propertyListForType:NSFilenamesPboardType];
NSInteger changeCount = pb.changeCount;

//when moving a window. the changeCount is not changed, use it to distinguish
if (filenames.count > 0 && self.lastChangeCount != changeCount){ 
    self.lastChangeCount = changeCount;
//your code here
}