我有一个可可应用程序,我需要在拖动会话期间响应 keyDown 事件以触发其他事情。键不仅是修饰符,还可以是任何类型的键。
问题是,当我通过调用 NSWindow.dragImage 开始拖动会话时,在该拖动操作期间我没有得到 keyDown 事件。当我将外部资源拖入/拖入应用程序窗口(例如,来自 Finder 的文件)时,它工作正常,调用 NSView.keyDown。
有没有办法解决这个问题?谢谢!
我有一个可可应用程序,我需要在拖动会话期间响应 keyDown 事件以触发其他事情。键不仅是修饰符,还可以是任何类型的键。
问题是,当我通过调用 NSWindow.dragImage 开始拖动会话时,在该拖动操作期间我没有得到 keyDown 事件。当我将外部资源拖入/拖入应用程序窗口(例如,来自 Finder 的文件)时,它工作正常,调用 NSView.keyDown。
有没有办法解决这个问题?谢谢!
这可能是因为拖动会话使用“鼠标跟踪循环”来处理拖动事件。这有效地阻止了所有其他事件被发送到它们的目标,除了拖动事件。您可以在活动文档中阅读有关此内容的信息。
将项目拖到您的应用程序不这样做的原因是,只有启动拖动会话的应用程序被事件阻止,而不是接收拖放的应用程序。
话虽如此,您可以尝试在mouseDragged
事件期间捕获 keyEvents,使用nextEventMatchingMask:untilDate:inMode:dequeue:
它应该允许您弹出可能在事件队列中的任何关键事件。
同样在上面链接的文档中,他们讨论了在鼠标拖动操作期间处理键事件。但是,这些示例在启动拖动会话时并不特别适合,dragImage:at:offset:event:pasteboard:source:slideBack:
但您可以尝试观看performKeyEquivalent
他们提到的内容,甚至查看 NSWindowsendEvent:
是否在拖动会话期间接收事件。