【问题标题】:Intercepting NSMenu key events拦截 NSMenu 键事件
【发布时间】: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 会是更好的方法。也看看这个问题:stackoverflow.com/questions/6070492/…
  • 彼得,您能与我们分享您的解决方案吗?
  • 我没有使用 NSMenu,因为我发现这种方法存在一些问题......现在我没有时间将它变成可以共享的可重用代码,也许我会回来使用它

标签: macos cocoa nstextfield 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 中进行了解释。

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-06-27
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      相关资源
      最近更新 更多