拦截NSMenu关键事件

时间:2015-08-12 15:03:44

标签: macos cocoa nstextfield nsmenu

我正在创建一个搜索字段,它会打开类似于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

enter image description here

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

Apple提供Sample Code,他们在WWDC 2010 session 145处解释了它。