在Cocoa应用程序中拖放时不调用NSView keyDown

时间:2013-05-24 13:25:50

标签: cocoa drag-and-drop nsview nswindow keydown

我有一个cocoa应用程序,我需要在拖动会话期间响应keyDown事件以触发其他事情。键不仅仅是修饰符,而是可以是任何键。

问题是,当我通过调用NSWindow.dragImage开始拖动会话时,我没有在拖动操作期间获得keyDown事件。当我将外部资源拖到应用程序窗口上(例如Finder中的文件)时,它可以正常工作,NSView.keyDown被调用。

有没有办法解决这个问题?谢谢你!

1 个答案:

答案 0 :(得分:0)

这可能是因为拖动会话使用“鼠标跟踪循环”来处理拖动事件。除了拖动事件之外,这有效地阻止所有其他事件被发送到其目标。您可以在event documentation

中阅读此处

将项目拖到您的应用上的原因并不是这样做是因为只有启动了拖动会话的应用才被阻止,而不是接收丢弃的应用。

说完这个之后,您可以尝试使用mouseDraggednextEventMatchingMask:untilDate:inMode:dequeue:事件期间捕获keyEvents,这应该允许您弹出可能在事件队列中的任何键事件。

同样在上面链接的文档中,他们讨论了在鼠标拖动操作期间处理关键事件。但是,在使用dragImage:at:offset:event:pasteboard:source:slideBack:启动拖动会话时,这些示例并不特别适合,但您可以尝试在他们提及的情况下观看performKeyEquivalent,甚至可以看到NSWindow的sendEvent:是否在拖动会话期间接收事件