1

在基于应用程序中拦截CmdAnyKey关键事件的最合适位置是什么?NSDocument

意图是切换到活动窗口中的某个组件——有点像 Firefox 允许您切换选项卡——而在菜单命令上没有匹配的快捷方式来执行该任务。

即,理想情况下,框架应该进行正常处理,包括处理菜单命令,并且在所有其他响应者未能响应该特定快捷方式之后,它应该被路由到自定义方法。

我已经搜索NSDocument, NSAppDelegateNSWindowController但找不到任何适当的机制来挂钩以便在窗口级别接收这些命令。

因此,缺乏任何现有的自定义机制是否会keyDown:在自定义中覆盖NSWindowController看起来像是达到预期效果的最合适的方式?

4

1 回答 1

2

是的,如果您需要在响应者链上的所有内容拒绝处理它之后获取键盘事件,则子类化 NSWindow 是执行此操作的方法。

以下是我在我的一个项目中的做法:

- (void)keyDown:(NSEvent*)event
{
    SEL keyDownBool = @selector(keyDownBool:);

    if ([[self delegate] respondsToSelector:keyDownBool]
    && [[self delegate] performSelector:keyDownBool withObject:event])
    {
        return;
    }

    [super keyDown:event];
}

如果我的自定义keyDownBool:委托方法处理了特定的键事件,它会返回 YES。否则,此方法将键事件向下传递给super.

现在我使用+ (id)addLocalMonitorForEventsMatchingMask:(NSEventMask)mask handler:(NSEvent* (^)(NSEvent*))block而不是子类化。不同之处在于它在分派事件之前处理(并且可以选择丢弃)事件。

于 2014-04-27T23:24:36.503 回答