拦截NSMenu键盘事件

6
我正在创建一个搜索栏,它会打开一个类似Finder和Mail的NSMenu。 唯一的问题是让我十分苦恼,一旦菜单被打开,我就无法拦截键盘事件。
  • 我甚至对NSApplication sendEvent进行了子类化,但惊讶地发现,在菜单中没有调用Applications sendAction:
  • 我对NSMenu进行了performKeyEquivalent:的子类化,但它并没有被调用
 - (BOOL)performKeyEquivalent:(NSEvent *)theEvent
  • 我正在监听menuHasKeyEquivalent:代理调用,但它没有被调用
 - (BOOL)menuHasKeyEquivalent:(NSMenu*)menu forEvent:(NSEvent*)event target:(id*)target action:(SEL*)action

enter image description here

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

KeyEquivalent 用于菜单快捷方式而不是拦截所有键,并且仅适用于应用程序的菜单栏。我认为,制作自定义窗口而不是 NSMenu 将是更好的方法。 还可以查看这个问题:https://dev59.com/mlfUa4cB1Zd3GeqPHmV3 - Abcd Efg
彼得,你可以和我们分享你的解决方案吗? - arturdev
我最终没有使用NSMenu,因为我发现了一些问题...目前我还没有时间将其制作成可重用的代码并分享,也许以后我会回来处理。 - Peter Lapisu
2个回答

5
可以使用Carbon事件处理程序进行拦截键盘事件,而菜单仍然保持打开状态。这些功能包括两个函数:GetEventDispatcherTarget()InstallEventHandler()。这是一个Hack,但实际上从10.7版本开始,在所有MacOSX版本上都可以可靠地工作。以下是可用作参考实现的源代码: https://github.com/mikekazakov/MGKMenuWithFilter

0

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

苹果提供了示例代码,并在WWDC 2010 session 145 的某个时候进行了解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接