没有编辑菜单的对话框中的 Cocoa 键盘快捷键 [英] Cocoa Keyboard Shortcuts in Dialog without an Edit Menu

查看:26
本文介绍了没有编辑菜单的对话框中的 Cocoa 键盘快捷键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个显示菜单栏状态项的 LSUIElement 应用程序.该应用程序可以显示一个包含文本字段的对话窗口.

I have an LSUIElement application that displays a menubar status item. The application can display a dialog window that contains a text field.

如果用户右键单击/按住 Control 单击文本字段,则会出现一个允许剪切、复制、粘贴等操作的菜单.但是,标准的 Command-X、Command-C 和 Command-V 键盘快捷键不会在该领域工作.我认为这是因为我的应用程序没有提供定义了这些快捷方式的编辑菜单.

If the user right-clicks/control-clicks the text field, a menu appears that allows cut, copy, paste, etc. However, the standard Command-X, Command-C, and Command-V keyboard shortcuts do not work in the field. I assume this is because my application does not provide an Edit menu with those shortcuts defined.

我已尝试将编辑"菜单项添加到我的应用程序菜单中,如 发送一些代码 博客,但这不起作用.可以使用编辑菜单中的菜单项,但键盘快捷键仍然不起作用.

I've tried adding an Edit menu item to my application's menu, as suggested in the Ship Some Code blog, but that did not work. The menu items in the Edit menu can be used, but keyboard shortcuts still don't work.

我可以想出几种破解键盘处理的方法,但是有没有一种推荐"的方法来实现这个功能?

I can imagine a few ways to hack the keyboard handling, but is there a "recommended" way to make this work?

(有关该应用的详细信息,请参阅菜单栏倒计时.)

(For details about the app, see Menubar Countdown.)

相关问题:复制/粘贴在模态窗口中不起作用

推荐答案

对我有用的是使用 复制和粘贴键盘快捷键在 CocoaRocket.

What worked for me was using The View Solution presented in Copy and Paste Keyboard Shortcuts at CocoaRocket.

基本上,这意味着继承 NSTextField 并覆盖 performKeyEquivalent:.

Basically, this means subclassing NSTextField and overriding performKeyEquivalent:.

更新: CocoaRocket 网站显然已经不存在了.这是 Internet Archive 链接:http:///web.archive.org/web/20100126000339/http://www.cocoarocket.com/articles/copypaste.html

Update: The CocoaRocket site is apparently gone. Here's the Internet Archive link: http://web.archive.org/web/20100126000339/http://www.cocoarocket.com/articles/copypaste.html

编辑:Swift 代码如下所示

Edit: The Swift code looks like this

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 代码如下

The Swift 3 code looks like this

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)
 }
}

这篇关于没有编辑菜单的对话框中的 Cocoa 键盘快捷键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆