0

我的NSTextField子类有一些问题。这是一个用于输入一些消息的文本字段。当我的子文本字段是第一响应者并且用户按下热键Cmd+时,我的应用程序必须发送此消息Enter。我不能使用 Carbon 方法RegisterEventHotKey(),因为许多应用程序使用此热键执行相同的操作,但我的应用程序拦截了它。我能做些什么?

4

2 回答 2

12

在文本字段委托中,您可以按照所有“标准”命令发送到控件。然后,一旦你遇到一个命令noop:,测试当前的组合键。如果是Command-Enter,做你的事。像这样的东西应该工作:

@interface VCEAppDelegate : NSObject <NSApplicationDelegate, NSTextFieldDelegate>
@property (nonatomic, weak) IBOutlet NSTextField *textField;
@end

// .m
@implementation VCEAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.textField.delegate = self;
}

- (BOOL)isCommandEnterEvent:(NSEvent *)e {
    NSUInteger flags = (e.modifierFlags & NSDeviceIndependentModifierFlagsMask);
    BOOL isCommand = (flags & NSCommandKeyMask) == NSCommandKeyMask;
    BOOL isEnter = (e.keyCode == 0x24); // VK_RETURN
    return (isCommand && isEnter);
}

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView
                          doCommandBySelector:(SEL)commandSelector {
    if ((commandSelector == @selector(noop:)) &&
        [self isCommandEnterEvent:[NSApp currentEvent]]) {
        [self handleCommandEnter];
        return YES;
    }
    return NO;
}

- (void)handleCommandEnter {
    NSLog(@"Do something on Command-Enter");
}

@end
于 2012-07-27T07:55:53.740 回答
1

我将 NSApplication 子类化并覆盖方法

- (void) sendEvent:(NSEvent*) event {
    if ([event type] == NSKeyDown) {
        if (([event modifierFlags] & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask) {
            if ([event keyCode] == 36) {
                if ([self.delegate respondsToSelector:@selector(sendMessage:)]) {
                    [self.delegate performSelector:@selector(sendMessage:) withObject:nil];
                }
            }
        }
    }

    [super sendEvent:event];
}

在 info.plist 中我写道,这个子 NSApplication 类是一个 Principal 类。有用!

于 2012-07-27T08:23:09.960 回答