拦截 NSMenu 键事件
Posted
技术标签:
【中文标题】拦截 NSMenu 键事件【英文标题】:Intercepting NSMenu key events 【发布时间】:2015-11-05 06:48:19 【问题描述】:我正在创建一个搜索字段,它会打开一个类似于 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期间如何拦截键盘输入
【问题讨论】:
KeyEquivalent 用于不拦截所有键的菜单快捷方式,仅适用于应用程序的菜单栏。我相信制作自定义窗口而不是 NSMenu 会是更好的方法。也看看这个问题:***.com/questions/6070492/… 彼得,您能与我们分享您的解决方案吗? 我没有使用 NSMenu,因为我发现这种方法存在一些问题......现在我没有时间将它变成可以共享的可重用代码,也许我会回来使用它 【参考方案1】:可以使用 Carbon 事件处理程序。这些函数允许在菜单打开时拦截键盘事件:GetEventDispatcherTarget()
和 InstallEventHandler()
。这是一个 hack,但事实上,它可以在从 10.7 开始的所有 MacOSX 版本中可靠地工作。以下是可用作参考实现的源代码:https://github.com/mikekazakov/MGKMenuWithFilter
【讨论】:
【参考方案2】:KeyEquivalent
用于不拦截所有键的菜单快捷方式。无需拦截NSMenu
事件,也不可能用于此目的。要制作建议框,您基本上需要制作自定义 NSWindow
并使其看起来像一个菜单。
Apple 提供了一个Sample Code,他们在某个时候在WWDC 2010 session 145 中进行了解释。
【讨论】:
以上是关于拦截 NSMenu 键事件的主要内容,如果未能解决你的问题,请参考以下文章
如何拦截所有键盘事件并防止在 WinForms 应用程序中失去焦点?