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



当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交谈后,这很可能是一个错误。我已提交rdar://25892115对于这个问题。对于给定的API,目前似乎没有办法解决我最初的问题。

为了解决我的问题,我现在使用Accessibility API来判断光标下面的项是否是文件(kAXFilenameAttribute不为NULL)。

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
}

相关内容

  • 没有找到相关文章

最新更新