将热键添加到 NSTextField

Posted

技术标签:

【中文标题】将热键添加到 NSTextField【英文标题】:Add HotKey to NSTextField 【发布时间】:2012-07-25 20:16:37 【问题描述】:

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

【问题讨论】:

【参考方案1】:

在文本字段委托中,您可以按照所有“标准”命令发送到控件。然后,一旦遇到命令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

【讨论】:

很高兴你成功了!尽管就类设计而言,我的解决方案更加解耦。如果您正在开发一个相当大的应用程序,请确保您确实想要继承 NSApplication 并微观管理该特定事件。祝你好运:) 这对我有用,除了使用委托 - (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector 而不是 - (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector。谢谢!【参考方案2】:

我继承了 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 类。有效!

【讨论】:

以上是关于将热键添加到 NSTextField的主要内容,如果未能解决你的问题,请参考以下文章

qt 注册热键

qt 注册热键

在文本区域中添加带有热键和javascript的文本

热键以分号结束行并跳转到 Sublime Text 2 中的新行

MFC 控件添加热键

制作“热键”以聚焦 WPF 中的文本框