Intercepting NSMenu key events

冷暖自知 提交于 2019-11-30 07:42:17

问题


I am making a search field, which opens a NSMenu similar to Finder and Mail

The only problem, which drives me crazy, is that i cannot intercept the key events, once the menu is open

  • I even subclassed the NSApplication sendEvent, but was surprised to find out, that during menu, there is no call to Applications sendAction:

  • I subclassed performKeyEquivalent: NSMenu but it is not called

 - (BOOL)performKeyEquivalent:(NSEvent *)theEvent
  • I am listening for the delegate call on menuHasKeyEquivalent: but it doesn't get called
 - (BOOL)menuHasKeyEquivalent:(NSMenu*)menu forEvent:(NSEvent*)event target:(id*)target action:(SEL*)action

How to intercept the keyboard input during NSMenu


回答1:


KeyEquivalent is for menu shortcuts not intercepting all the keys. There is no need to intercept the NSMenu events and it is not possible to be used for that purpose. To make a suggestion box you basically need to make a custom NSWindow and make it look like a menu.

Apple provides a Sample Code and they explained it in WWDC 2010 session 145 at some point.




回答2:


It is possible with a usage of Carbon event handlers. These functions allow interception of keyboard events while menu is open: GetEventDispatcherTarget() and InstallEventHandler(). This is a hack, but in fact, it works reliably across all MacOSX versions starting from 10.7. Here's the source code that could be used as a reference implementation: https://github.com/mikekazakov/MGKMenuWithFilter



来源:https://stackoverflow.com/questions/31968959/intercepting-nsmenu-key-events

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!