4

我已经为 a 设置了一个自定义NSViewNSMenuItem进行自己的绘图和渲染。然而,分配给 'keyEquivalent'NSMenuItem似乎没有响应。我了解绘图和动作处理需要自行处理,但无论我做什么,我似乎都无法捕获 keyEquivalent 请求。我尝试将 NSApplication 的 sendEvent 子类化,但这不起作用,因为我的应用程序是NSStatusBarItem(LSUIElement) 并且来自NSEventTrackingRunLoopMode(当菜单关闭时)的事件没有到达 NSApplication 的 sendEvent。

然后我尝试使用:

- (BOOL)menuHasKeyEquivalent:(NSMenu *)menu forEvent:(NSEvent *)event target:(id *)target action:(SEL *)action

这也不起作用,因为即使我已将主菜单的委托设置为控制器,它也不会被调用。

有没有人知道如何在使用自定义视图时捕获 NSMenuItems 上的“keyEquivalent”事件?

谢谢!

4

1 回答 1

1

我知道这是一篇旧帖子,您可能早就过了这个帖子,但是我遇到了同样的问题,并且在尝试找到解决方案时多次遇到您的帖子,所以我想我会分享对我有用的东西。

我能够通过继承 NSApplication 并覆盖 sendEvent 来解决这个问题。你提到你试过这个没有成功,所以我不知道有什么区别,但我在 NSStatusBarItem 中拦截来自 NSMenu 的事件没有问题。我的键等价物都是整数,所以我验证键,找到适当的项目,然后显式调用 NSMenuItem 操作。

-(void)sendEvent:(NSEvent *)theEvent
{
    if([theEvent type] == NSKeyUp){
        NSInteger mod = ([theEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask);

        if(mod == NSCommandKeyMask) {
            NSInteger keyEquiv = [[theEvent characters] isEqualToString:@"0"]
            ? 10
            : [[theEvent characters] integerValue];
            if(keyEquiv > 0) {
                NSMenuItem *item = [[(MyAppDelegate *)[self delegate] myStatusMenu] itemAtIndex:(keyEquiv - 1)];
                if([[item keyEquivalent] integerValue] == keyEquiv){
                    [[item target] performSelector:[item action] withObject:item];
                }
            }
        }
    }
    [super sendEvent:theEvent];
}
于 2012-02-18T22:34:56.780 回答