在Cocoa应用程序中拖放期间未调用NSView keyDown

在Cocoa应用程序中拖放期间未调用NSView keyDown,cocoa,drag-and-drop,nsview,nswindow,keydown,Cocoa,Drag And Drop,Nsview,Nswindow,Keydown,我有一个cocoa应用程序,在拖动会话期间,我需要对按键事件做出响应,以便触发其他事件。关键点不仅是修改器,而且可以是任何类型的关键点 问题是,当我通过调用NSWindow.dragImage启动拖动会话时,在拖动操作期间,我不会获得keyDown事件。当我将一个外部资源拖到应用程序窗口上/拖到应用程序窗口中(例如,Finder中的文件)时,它工作正常,会调用NSView.keyDown 有没有办法绕过这件事?谢谢你 这可能是因为拖动会话正在使用“鼠标跟踪循环”来处理拖动事件。这有效地阻止了除拖

我有一个cocoa应用程序,在拖动会话期间,我需要对按键事件做出响应,以便触发其他事件。关键点不仅是修改器,而且可以是任何类型的关键点

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


有没有办法绕过这件事?谢谢你

这可能是因为拖动会话正在使用“鼠标跟踪循环”来处理拖动事件。这有效地阻止了除拖动事件外的所有其他事件发送到其目标。你可以在这里的网站上看到

将项目拖动到应用程序上无法执行此操作的原因是,只有启动拖动会话的应用程序被事件阻止,而不是接收拖放的应用程序

话虽如此,您可以尝试使用
nexteventmachingmask:untilDate:inMode:dequeue:
mouseDragged
事件期间捕获关键事件,这将允许您弹出事件队列中的任何关键事件


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

感谢您的帮助回答Ryan,这会帮助我走得更远!