拦截 NSMenu 按键事件
Intercepting NSMenu key events
我正在制作一个搜索字段,它会打开一个类似于 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
事件,也不可能用于该目的。要制作建议框,您基本上需要制作自定义 NSWindow
并使其看起来像菜单。
Apple 在某些时候提供了 Sample Code and they explained it in WWDC 2010 session 145。
使用 Carbon 事件处理程序是可能的。这些函数允许在菜单打开时拦截键盘事件:GetEventDispatcherTarget()
和 InstallEventHandler()
。这是一个 hack,但实际上,它可以在从 10.7 开始的所有 MacOSX 版本中可靠地工作。以下是可用作参考实现的源代码:https://github.com/mikekazakov/MGKMenuWithFilter
我正在制作一个搜索字段,它会打开一个类似于 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
事件,也不可能用于该目的。要制作建议框,您基本上需要制作自定义 NSWindow
并使其看起来像菜单。
Apple 在某些时候提供了 Sample Code and they explained it in WWDC 2010 session 145。
使用 Carbon 事件处理程序是可能的。这些函数允许在菜单打开时拦截键盘事件:GetEventDispatcherTarget()
和 InstallEventHandler()
。这是一个 hack,但实际上,它可以在从 10.7 开始的所有 MacOSX 版本中可靠地工作。以下是可用作参考实现的源代码:https://github.com/mikekazakov/MGKMenuWithFilter