代码之家  ›  专栏  ›  技术社区  ›  Peter Coulton

不带编辑菜单的对话框中的快捷键

  •  32
  • Peter Coulton  · 技术社区  · 6 年前

    LSUIElement 显示菜单栏状态项的应用程序。应用程序可以显示包含文本字段的对话框窗口。

    我已尝试将“编辑”菜单项添加到应用程序的菜单中,如 Ship Some Code

    我可以想象一些破解键盘操作的方法,但是有没有一种“推荐”的方法可以让它工作呢?

    (有关该应用程序的详细信息,请参阅 Menubar Countdown .)

    相关问题: Copy/Paste Not Working in Modal Window

    15 回复  |  直到 5 年前
        1
  •  44
  •   Mathias    7 年前

    改进CocoaRocket解决方案:

    下面省去了在整个应用程序中使用子类NSTextField的麻烦;它还将为处理它们的其他响应者(例如NSTextView)启用复制、粘贴和好友。

    - (void) sendEvent:(NSEvent *)event {
        if ([event type] == NSKeyDown) {
            if (([event modifierFlags] & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask) {
                if ([[event charactersIgnoringModifiers] isEqualToString:@"x"]) {
                    if ([self sendAction:@selector(cut:) to:nil from:self])
                        return;
                }
                else if ([[event charactersIgnoringModifiers] isEqualToString:@"c"]) {
                    if ([self sendAction:@selector(copy:) to:nil from:self])
                        return;
                }
                else if ([[event charactersIgnoringModifiers] isEqualToString:@"v"]) {
                    if ([self sendAction:@selector(paste:) to:nil from:self])
                        return;
                }
                else if ([[event charactersIgnoringModifiers] isEqualToString:@"z"]) {
                    if ([self sendAction:@selector(undo:) to:nil from:self])
                        return;
                }
                else if ([[event charactersIgnoringModifiers] isEqualToString:@"a"]) {
                    if ([self sendAction:@selector(selectAll:) to:nil from:self])
                        return;
                }
            }
            else if (([event modifierFlags] & NSDeviceIndependentModifierFlagsMask) == (NSCommandKeyMask | NSShiftKeyMask)) {
                if ([[event charactersIgnoringModifiers] isEqualToString:@"Z"]) {
                    if ([self sendAction:@selector(redo:) to:nil from:self])
                        return;
                }
            }
        }
        [super sendEvent:event];
    }
    
    // Blank Selectors to silence Xcode warnings: 'Undeclared selector undo:/redo:'
    - (IBAction)undo:(id)sender {}
    - (IBAction)redo:(id)sender {}
    
        2
  •  31
  •   Thomas Kilian    8 年前

    视图解决方案 呈递 Copy and Paste Keyboard Shortcuts

    基本上,这意味着子类化NSTextField并重写 performKeyEquivalent:

    更新: CocoaRocket网站显然已经消失了。以下是Internet存档链接: http://web.archive.org/web/20100126000339/http://www.cocoarocket.com/articles/copypaste.html

    编辑

    class Editing: NSTextField {
    
      private let commandKey = NSEventModifierFlags.CommandKeyMask.rawValue
      private let commandShiftKey = NSEventModifierFlags.CommandKeyMask.rawValue | NSEventModifierFlags.ShiftKeyMask.rawValue
      override func performKeyEquivalent(event: NSEvent) -> Bool {
        if event.type == NSEventType.KeyDown {
          if (event.modifierFlags.rawValue & NSEventModifierFlags.DeviceIndependentModifierFlagsMask.rawValue) == commandKey {
            switch event.charactersIgnoringModifiers! {
            case "x":
              if NSApp.sendAction(Selector("cut:"), to:nil, from:self) { return true }
            case "c":
              if NSApp.sendAction(Selector("copy:"), to:nil, from:self) { return true }
            case "v":
              if NSApp.sendAction(Selector("paste:"), to:nil, from:self) { return true }
            case "z":
              if NSApp.sendAction(Selector("undo:"), to:nil, from:self) { return true }
            case "a":
              if NSApp.sendAction(Selector("selectAll:"), to:nil, from:self) { return true }
            default:
              break
            }
          }
          else if (event.modifierFlags.rawValue & NSEventModifierFlags.DeviceIndependentModifierFlagsMask.rawValue) == commandShiftKey {
            if event.charactersIgnoringModifiers == "Z" {
              if NSApp.sendAction(Selector("redo:"), to:nil, from:self) { return true }
            }
          }
        }
        return super.performKeyEquivalent(event)
      }
    }
    

    编辑: Swift 3代码如下所示

    class Editing: NSTextView {
    
    private let commandKey = NSEventModifierFlags.command.rawValue
    private let commandShiftKey = NSEventModifierFlags.command.rawValue | NSEventModifierFlags.shift.rawValue
    
    override func performKeyEquivalent(with event: NSEvent) -> Bool {
        if event.type == NSEventType.keyDown {
            if (event.modifierFlags.rawValue & NSEventModifierFlags.deviceIndependentFlagsMask.rawValue) == commandKey {
                switch event.charactersIgnoringModifiers! {
                case "x":
                    if NSApp.sendAction(#selector(NSText.cut(_:)), to:nil, from:self) { return true }
                case "c":
                    if NSApp.sendAction(#selector(NSText.copy(_:)), to:nil, from:self) { return true }
                case "v":
                    if NSApp.sendAction(#selector(NSText.paste(_:)), to:nil, from:self) { return true }
                case "z":
                    if NSApp.sendAction(Selector(("undo:")), to:nil, from:self) { return true }
                case "a":
                    if NSApp.sendAction(#selector(NSResponder.selectAll(_:)), to:nil, from:self) { return true }
                default:
                    break
                }
            }
            else if (event.modifierFlags.rawValue & NSEventModifierFlags.deviceIndependentFlagsMask.rawValue) == commandShiftKey {
                if event.charactersIgnoringModifiers == "Z" {
                    if NSApp.sendAction(Selector(("redo:")), to:nil, from:self) { return true }
                }
            }
        }
        return super.performKeyEquivalent(with: event)
     }
    }
    
        3
  •  19
  •   Kuba Suder    14 年前

    我和你有同样的问题,我想我已经找到了一个更简单的解决办法。您只需将原始主菜单保留在MainMenu.xib中-它不会显示,但所有操作都将得到正确处理。诀窍是它必须是原始的,如果你只是从库中拖动一个新的NSMenu,应用程序将无法识别它是主菜单,我也不知道如何将其标记为主菜单(如果你取消选中LSUIElement,你会看到它不会显示在顶部,如果它不是原始的)。如果您已经删除了它,您可以创建一个新的示例应用程序,并从它的NIB中拖动一个菜单,这同样有效。

        4
  •  10
  •   T Blank    10 年前

    我改进了Adrian的解决方案,使其在Caps Lock打开时也能正常工作:

    - (void)sendEvent:(NSEvent *)event
    {
        if (event.type == NSKeyDown)
        {
            NSString *inputKey = [event.charactersIgnoringModifiers lowercaseString];
            if ((event.modifierFlags & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask ||
                (event.modifierFlags & NSDeviceIndependentModifierFlagsMask) == (NSCommandKeyMask | NSAlphaShiftKeyMask))
            {
                if ([inputKey isEqualToString:@"x"])
                {
                    if ([self sendAction:@selector(cut:) to:nil from:self])
                        return;
                }
                else if ([inputKey isEqualToString:@"c"])
                {
                    if ([self sendAction:@selector(copy:) to:nil from:self])
                        return;
                }
                else if ([inputKey isEqualToString:@"v"])
                {
                    if ([self sendAction:@selector(paste:) to:nil from:self])
                        return;
                }
                else if ([inputKey isEqualToString:@"z"])
                {
                    if ([self sendAction:NSSelectorFromString(@"undo:") to:nil from:self])
                        return;
                }
                else if ([inputKey isEqualToString:@"a"])
                {
                    if ([self sendAction:@selector(selectAll:) to:nil from:self])
                        return;
                }
            }
            else if ((event.modifierFlags & NSDeviceIndependentModifierFlagsMask) == (NSCommandKeyMask | NSShiftKeyMask) ||
                     (event.modifierFlags & NSDeviceIndependentModifierFlagsMask) == (NSCommandKeyMask | NSShiftKeyMask | NSAlphaShiftKeyMask))
            {
                if ([inputKey isEqualToString:@"z"])
                {
                    if ([self sendAction:NSSelectorFromString(@"redo:") to:nil from:self])
                        return;
                }
            }
        }
        [super sendEvent:event];
    }
    
        5
  •  8
  •   josealobato    8 年前

    swift 3中的Thomas Kilian解。

    private let commandKey = NSEventModifierFlags.command.rawValue
    private let commandShiftKey = NSEventModifierFlags.command.rawValue | NSEventModifierFlags.shift.rawValue
    override func performKeyEquivalent(with event: NSEvent) -> Bool {
      if event.type == NSEventType.keyDown {
        if (event.modifierFlags.rawValue & NSEventModifierFlags.deviceIndependentFlagsMask.rawValue) == commandKey {
        switch event.charactersIgnoringModifiers! {
        case "x":
          if NSApp.sendAction(#selector(NSText.cut(_:)), to:nil, from:self) { return true }
        case "c":
          if NSApp.sendAction(#selector(NSText.copy(_:)), to:nil, from:self) { return true }
        case "v":
          if NSApp.sendAction(#selector(NSText.paste(_:)), to:nil, from:self) { return true }
        case "z":
          if NSApp.sendAction(Selector(("undo:")), to:nil, from:self) { return true }
        case "a":
          if NSApp.sendAction(#selector(NSResponder.selectAll(_:)), to:nil, from:self) { return true }
        default:
          break
        }
      }
      else if (event.modifierFlags.rawValue & NSEventModifierFlags.deviceIndependentFlagsMask.rawValue) == commandShiftKey {
        if event.charactersIgnoringModifiers == "Z" {
          if NSApp.sendAction(Selector(("redo:")), to:nil, from:self) { return true }
        }
      }
    }
    return super.performKeyEquivalent(with: event)
    }
    
        6
  •  7
  •   memoris    6 年前

    import Cocoa
    
    extension NSTextView {
    override open func performKeyEquivalent(with event: NSEvent) -> Bool {
        let commandKey = NSEvent.ModifierFlags.command.rawValue
        let commandShiftKey = NSEvent.ModifierFlags.command.rawValue | NSEvent.ModifierFlags.shift.rawValue
        if event.type == NSEvent.EventType.keyDown {
            if (event.modifierFlags.rawValue & NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue) == commandKey {
                switch event.charactersIgnoringModifiers! {
                case "x":
                    if NSApp.sendAction(#selector(NSText.cut(_:)), to:nil, from:self) { return true }
                case "c":
                    if NSApp.sendAction(#selector(NSText.copy(_:)), to:nil, from:self) { return true }
                case "v":
                    if NSApp.sendAction(#selector(NSText.paste(_:)), to:nil, from:self) { return true }
                case "z":
                    if NSApp.sendAction(Selector(("undo:")), to:nil, from:self) { return true }
                case "a":
                    if NSApp.sendAction(#selector(NSResponder.selectAll(_:)), to:nil, from:self) { return true }
                default:
                    break
                }
            } else if (event.modifierFlags.rawValue & NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue) == commandShiftKey {
                if event.charactersIgnoringModifiers == "Z" {
                    if NSApp.sendAction(Selector(("redo:")), to:nil, from:self) { return true }
                }
            }
        }
        return super.performKeyEquivalent(with: event)
    }
    }
    
        7
  •  5
  •   Neitherman    6 年前

    针对Thomas Kilian解决方案的Swift 4.2

    class MTextField: NSSecureTextField {
    
        private let commandKey = NSEvent.ModifierFlags.command.rawValue
        private let commandShiftKey = NSEvent.ModifierFlags.command.rawValue | NSEvent.ModifierFlags.shift.rawValue
    
        override func performKeyEquivalent(with event: NSEvent) -> Bool {
            if event.type == NSEvent.EventType.keyDown {
                if (event.modifierFlags.rawValue & NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue) == commandKey {
                    switch event.charactersIgnoringModifiers! {
                    case "x":
                        if NSApp.sendAction(#selector(NSText.cut(_:)), to:nil, from:self) { return true }
                    case "c":
                        if NSApp.sendAction(#selector(NSText.copy(_:)), to:nil, from:self) { return true }
                    case "v":
                        if NSApp.sendAction(#selector(NSText.paste(_:)), to:nil, from:self) { return true }
                    case "z":
                        if NSApp.sendAction(Selector(("undo:")), to:nil, from:self) { return true }
                    case "a":
                        if NSApp.sendAction(#selector(NSResponder.selectAll(_:)), to:nil, from:self) { return true }
                    default:
                        break
                    }
                }
                else if (event.modifierFlags.rawValue & NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue) == commandShiftKey {
                    if event.charactersIgnoringModifiers == "Z" {
                        if NSApp.sendAction(Selector(("redo:")), to:nil, from:self) { return true }
                    }
                }
            }
            return super.performKeyEquivalent(with: event)
        }
    
    }
    
        8
  •  4
  •   Lukx    10 年前

    这里有一个快速的swift指南,基于@Adrian、Travis B和Thomas Kilian的优秀答案。

    目标是将NSApplication子类化,而不是NSTextField。创建此类后,请按照Adrian的说明,将其链接到Info.plist的“principal class”设置中。与Objective-C不同的是,我们速战机必须在principalClass配置中添加一个额外的前缀。因此,因为我的项目名为“Foo”,所以我要将“Principal Class”设置为“Foo.MyApplication”。否则将出现“未找到类MyApplication”运行时错误。

    import Cocoa
    
    class MyApplication: NSApplication {
        override func sendEvent(event: NSEvent) {
            if event.type == NSEventType.KeyDown {
                if (event.modifierFlags & NSEventModifierFlags.DeviceIndependentModifierFlagsMask == NSEventModifierFlags.CommandKeyMask) {
                    switch event.charactersIgnoringModifiers!.lowercaseString {
                    case "x":
                        if NSApp.sendAction(Selector("cut:"), to:nil, from:self) { return }
                    case "c":
                        if NSApp.sendAction(Selector("copy:"), to:nil, from:self) { return }
                    case "v":
                        if NSApp.sendAction(Selector("paste:"), to:nil, from:self) { return }
                    case "z":
                        if NSApp.sendAction(Selector("undo:"), to:nil, from:self) { return }
                    case "a":
                        if NSApp.sendAction(Selector("selectAll:"), to:nil, from:self) { return }
                    default:
                        break
                    }
                }
                else if (event.modifierFlags & NSEventModifierFlags.DeviceIndependentModifierFlagsMask == (NSEventModifierFlags.CommandKeyMask | NSEventModifierFlags.ShiftKeyMask)) {
                    if event.charactersIgnoringModifiers == "Z" {
                        if NSApp.sendAction(Selector("redo:"), to:nil, from:self) { return }
                    }
                }
            }
            return super.sendEvent(event)
        }
    
    }
    
        9
  •  3
  •   Subhash Chandran    8 年前

    我解释了在XCode 8/Swift 3中对我有用的东西。

    我创造 MyApplication.swift MyApp :

    import Foundation
    import Cocoa
    
    class MyApplication: NSApplication {
        override func sendEvent(_ event: NSEvent) {
            if event.type == NSEventType.keyDown {
    
                if (event.modifierFlags.contains(NSEventModifierFlags.command)) {
                    switch event.charactersIgnoringModifiers!.lowercased() {
                    case "x":
                        if NSApp.sendAction(#selector(NSText.cut(_:)), to:nil, from:self) { return }
                    case "c":
                        if NSApp.sendAction(#selector(NSText.copy(_:)), to:nil, from:self) { return }
                    case "v":
                        if NSApp.sendAction(#selector(NSText.paste(_:)), to:nil, from:self) { return }
                    case "a":
                        if NSApp.sendAction(#selector(NSText.selectAll(_:)), to:nil, from:self) { return }
                    default:
                        break
                    }
                }
            }
            return super.sendEvent(event)
        }
    
    }
    

    然后换一个 Info.plist Principal class MyApp.MyApplication . 生成并运行以验证我的文本字段和文本视图是否支持 Cmd + X , Cmd + C , Cmd + V Cmd + A

        10
  •  3
  •   Chris    7 年前

    根本不需要添加新的类、扩展或任何代码。

    1. 只需在其中一个菜单中添加一个新菜单项,并将其命名为“复制”、“剪切”和“粘贴”。
    2. 为每个项目添加正确的快捷键。

    这里的好处是,这些项目不会对用户隐藏,这比创建一个新类并将所有现有文本字段重新分配给它所需的时间要少。

        11
  •  0
  •   Alex    10 年前

    大约一小时前,我偶然发现了同样的问题。

    • 创建包含剪切/复制/粘贴菜单项的菜单(例如“编辑”)
    • 将CMD键的等效键添加到“编辑”菜单(不知道,如果真的需要,我只是从另一个项目复制了该结构)
    • FirstResponder cut: , copy: paste:

    这对我很管用。 不幸的是,当您隐藏“编辑”菜单(只是尝试了一下)时,这种(默认)行为似乎不起作用。

        12
  •  0
  •   Justin Caldicott    9 年前

    下面是Travis的答案,C#用于Xamarin.Mac:

        public override bool PerformKeyEquivalent (AppKit.NSEvent e)
        {
            if (e.Type == NSEventType.KeyDown) {
                var inputKey = e.CharactersIgnoringModifiers.ToLower ();
                if (   (e.ModifierFlags & NSEventModifierMask.DeviceIndependentModifierFlagsMask) == NSEventModifierMask.CommandKeyMask
                    || (e.ModifierFlags & NSEventModifierMask.DeviceIndependentModifierFlagsMask) == (NSEventModifierMask.CommandKeyMask | NSEventModifierMask.AlphaShiftKeyMask)) {
                    switch (inputKey) {
                    case "x":
                        NSApplication.SharedApplication.SendAction (new Selector ("cut:"), null, this);
                        return true;
                    case "c":
                        NSApplication.SharedApplication.SendAction (new Selector ("copy:"), null, this);
                        return true;
                    case "v":
                        NSApplication.SharedApplication.SendAction (new Selector ("paste:"), null, this);
                        return true;
                    case "z":
                        NSApplication.SharedApplication.SendAction (new Selector ("undo:"), null, this);
                        return true;
                    case "a":
                        NSApplication.SharedApplication.SendAction (new Selector ("selectAll:"), null, this);
                        return true;
                    }
                } else if (   (e.ModifierFlags & NSEventModifierMask.DeviceIndependentModifierFlagsMask) == (NSEventModifierMask.CommandKeyMask | NSEventModifierMask.ShiftKeyMask)
                           || (e.ModifierFlags & NSEventModifierMask.DeviceIndependentModifierFlagsMask) == (NSEventModifierMask.CommandKeyMask | NSEventModifierMask.ShiftKeyMask | NSEventModifierMask.AlphaShiftKeyMask)) {
                    switch (inputKey) {
                    case "z":
                        NSApplication.SharedApplication.SendAction (new Selector ("redo:"), null, this);
                        return true;
                    }
                }
            }
            return base.PerformKeyEquivalent(e);
        }
    
        13
  •  0
  •   Morse    7 年前

    Thomas Kilian 的答案是,实际上可以为NSTextField创建扩展

    let commandKey = NSEvent.ModifierFlags.command.rawValue
    let commandShiftKey = NSEvent.ModifierFlags.command.rawValue | NSEvent.ModifierFlags.shift.rawValue
    
    extension NSTextField {
        func performEditingKeyEquivalent(with event: NSEvent) -> Bool {
            guard event.type == NSEvent.EventType.keyDown else { return false }
    
            if (event.modifierFlags.rawValue & NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue) == commandKey {
                if let character = event.charactersIgnoringModifiers {
                    switch character {
                    case "x":
                        if NSApp.sendAction(#selector(NSText.cut(_:)), to: nil, from: self) { return true }
                    case "c":
                        if NSApp.sendAction(#selector(NSText.copy(_:)), to: nil, from: self) { return true }
                    case "v":
                        if NSApp.sendAction(#selector(NSText.paste(_:)), to: nil, from: self) { return true }
                    case "z":
                        if NSApp.sendAction(Selector(("undo:")), to: nil, from: self) { return true }
                    case "a":
                        if NSApp.sendAction(#selector(NSResponder.selectAll(_:)), to: nil, from: self) { return true }
                    default:
                        break
                    }
                }
            } else if (event.modifierFlags.rawValue & NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue) == commandShiftKey {
                if event.charactersIgnoringModifiers == "Z" {
                    if NSApp.sendAction(Selector(("redo:")), to: nil, from: self) { return true }
                }
            }
    
            return false
        }
    }
    

    在下面的示例中,实际上可以替换 NSTextField 任何一个 NSTextField NSSearchField NSSecureTextField )拥有新的功能

    class SearchField: NSTextField {
        override func performKeyEquivalent(with event: NSEvent) -> Bool {
            if performEditingKeyEquivalent(with: event) {
                return true
            }
    
            return super.performEditingKeyEquivalent(with: event)
        }
    }
    
        14
  •  0
  •   larromba    6 年前

    感谢您提供此解决方案!它对我帮助很大,所以我决定贡献一些代码,希望它能帮助其他人。在我将上面建议的解决方案转换为 Swift 4.2 . 然后我对代码进行了一点重构。我觉得这有点干净。这是 兼容的:

    // NSEventExtensions.swift
    
    import AppKit
    
    extension NSEvent {
        func containsKeyModifierFlags(_ flags: NSEvent.ModifierFlags) -> Bool {
            switch modifierFlags.intersection(.deviceIndependentFlagsMask) {
            case [flags]: return true
            default: return false
            }
        }
    }
    
    // SearchFiled.swift
    
    import AppKit
    import Carbon
    
    final class SearchField: NSSearchField {
        override func performKeyEquivalent(with event: NSEvent) -> Bool {
            switch event.type {
            case .keyDown: return performKeyDownEquivalent(with: event)
            default: return super.performKeyEquivalent(with: event)
            }
        }
    
        // MARK: - private
    
        private func performKeyDownEquivalent(with event: NSEvent) -> Bool {
            if event.containsKeyModifierFlags(.command) {
                switch Int(event.keyCode) {
                case kVK_ANSI_X: return NSApp.sendAction(#selector(NSText.cut(_:)), to: nil, from: self)
                case kVK_ANSI_C: return NSApp.sendAction(#selector(NSText.copy(_:)), to: nil, from: self)
                case kVK_ANSI_V: return NSApp.sendAction(#selector(NSText.paste(_:)), to: nil, from: self)
                case kVK_ANSI_Z: return NSApp.sendAction(Selector(("undo:")), to: nil, from: self)
                case kVK_ANSI_A: return NSApp.sendAction(#selector(NSResponder.selectAll(_:)), to: nil, from: self)
                default: break
                }
            } else if event.containsKeyModifierFlags([.command, .shift]) {
                switch Int(event.keyCode) {
                case kVK_ANSI_Z: return NSApp.sendAction(Selector(("redo:")), to: nil, from: self)
                default: break
                }
            }
            return false
        }
    }
    
        15
  •  0
  •   imike    4 年前

    斯威夫特5 解决方案 NSApplication 子类

    open override func sendEvent(_ event: NSEvent) {
        if event.type == .keyDown {
            if event.modifierFlags.contains(.command)  && NSEvent.ModifierFlags.deviceIndependentFlagsMask.contains(.command) {
                if event.modifierFlags.contains(.shift) && NSEvent.ModifierFlags.deviceIndependentFlagsMask.contains(.shift) {
                    if event.charactersIgnoringModifiers == "Z" {
                        if NSApp.sendAction(Selector("redo:"), to:nil, from:self) { return }
                    }
                }
                guard let key = event.charactersIgnoringModifiers else { return super.sendEvent(event) }
                switch key {
                case "x":
                    if NSApp.sendAction(Selector("cut:"), to:nil, from:self) { return }
                case "c":
                    if NSApp.sendAction(Selector("copy:"), to:nil, from:self) { return }
                case "v":
                    if NSApp.sendAction(Selector("paste:"), to:nil, from:self) { return }
                case "z":
                    if NSApp.sendAction(Selector("undo:"), to:nil, from:self) { return }
                case "a":
                    if NSApp.sendAction(Selector("selectAll:"), to:nil, from:self) { return }
                default:
                    break
              }
            }
        }
        super.sendEvent(event)
    }
    
        16
  •  -1
  •   PhilipG    10 年前

        uint const modifierCode = (theEvent.modifierFlags & NSDeviceIndependentModifierFlagsMask);
        BOOL usingModifiers = ( modifierCode != 0 );
        //BOOL const usingShiftKey = ((theEvent.modifierFlags & NSShiftKeyMask) != 0);
        //BOOL const usingCommandKey = ((theEvent.modifierFlags & NSCommandKeyMask) != 0);
        NSString * ch = [theEvent charactersIgnoringModifiers];
        if ( ( usingModifiers ) && ( ch.length == 1 ) ) switch ( [ch characterAtIndex:0] )
        {
            case 'x':
                if ( modifierCode == NSCommandKeyMask ) [m cut]; // <-- m = model
                break;
            case 'c':
                if ( modifierCode == NSCommandKeyMask ) [m copy];
                break;
            case 'v':
                if ( modifierCode == NSCommandKeyMask ) [m paste];
                break;
            case 'z':
                if ( modifierCode == NSCommandKeyMask ) [m undo];
                break;
            case 'Z':
                if ( modifierCode == ( NSCommandKeyMask | NSShiftKeyMask ) ) [m redo];
                break;
            default: // etc.
                break;
        }
        else switch ( theEvent.keyCode ) // <-- for independent keycodes!
        {
            case kVK_Home:
                [m moveToBeginningOfDocument:nil];
                break;
            case kVK_End: // etc!