拦截 NSMenu 按键事件

Pet*_*isu 5 macos cocoa nsmenu nstextfield

我正在制作一个搜索字段,它会打开一个类似于 Finder 和 Mail 的 NSMenu

唯一让我发疯的问题是,一旦菜单打开,我就无法拦截关键事件

  • 我什至将 NSApplication sendEvent 子类化,但惊讶地发现,在菜单期间,没有调用 Applications sendAction:

  • 我继承了 performKeyEquivalent: NSMenu 但它没有被调用

 - (BOOL)performKeyEquivalent:(NSEvent *)theEvent
  • 我正在监听 menuHasKeyEquivalent 上的委托调用:但它没有被调用
 - (BOOL)menuHasKeyEquivalent:(NSMenu*)menu forEvent:(NSEvent*)event target:(id*)target action:(SEL*)action

在此处输入图片说明

如何在 NSMenu 期间拦截键盘输入

小智 5

使用 Carbon 事件处理程序可以实现这一点。这些函数允许在菜单打开时拦截键盘事件:GetEventDispatcherTarget()InstallEventHandler()。这是一个 hack,但事实上,它可以在从 10.7 开始的所有 MacOSX 版本上可靠地工作。以下是可用作参考实现的源代码:https://github.com/mikekazakov/MGKMenuWithFilter


Abc*_*Efg 0

KeyEquivalent用于菜单快捷键不拦截所有按键。无需拦截NSMenu事件,也不可能用于此目的。要制作建议框,您基本上需要进行自定义NSWindow并使其看起来像菜单。

Apple 提供了示例代码,并在WWDC 2010 第 145 次会议上的某个时刻对其进行了解释。