拦截 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 键事件的主要内容,如果未能解决你的问题,请参考以下文章

Android 11.0 播放视频时,拦截上下键事件

如何拦截所有键盘事件并防止在 WinForms 应用程序中失去焦点?

c# 为自定义控件添加鼠标双击事件

自定义 NSMenu(如 Apple 的 Dock 右键菜单)?

IMS:Input事件可拦截位置

QT 捕获事件(全局拦截)