Mac Catalyst无法通过presss捕获.command键修饰符

问题描述

我正在为iOS(以及通过Mac Catalyst的MacOS)开发一个远程桌面控制应用程序,该应用程序必须能够捕获设备上的所有键盘输入,包括Cmd键(等效于非Mac键盘上的Super / Start键)。该应用位于前台,以便将其发送到远程桌面。

我还没有尝试查看带有外部键盘的iOS设备是否看到.command键修饰符,但是当我启用Mac Catalyst支持并在Mac上安装了该应用程序并将以下方法添加到AppDelegate时:

    override func pressesBegan(_ presses: Set<UIPress>,with event: UIPressesEvent?) {
    super.pressesBegan(presses,with: event)
    print(presses.first?.key,presses.first?.key?.modifierFlags)
}
override func pressesEnded(_ presses: Set<UIPress>,with event: UIPressesEvent?) {
    super.pressesEnded(presses,presses.first?.key?.modifierFlags)
}
override func pressesCancelled(_ presses: Set<UIPress>,with event: UIPressesEvent?) {
    super.pressesCancelled(presses,presses.first?.key?.modifierFlags)
}

除了Cmd / Start / Super键也位于组合键中时,我几乎可以捕获我尝试的任何组合键。当Cmd键处于组合键中或单独按下时,绝对没有任何东西发送到应用程序。该事件似乎已被Mac OS X完全保留并使用。

为使本篇文章更为完整,我想补充一点,就是我尝试从应用程序中删除所有菜单,以防万一该菜单被归咎于使用了Cmd键事件,但没有任何变化:

    override func buildMenu(with builder: UIMenuBuilder) {
    if builder.system == .main {
        builder.remove(menu: .edit)
        builder.remove(menu: .format)
        builder.remove(menu: .help)
        builder.remove(menu: .file)
        builder.remove(menu: .window)
        builder.remove(menu: .view)
        let dummyCommand = UICommand(title: "Dummy",action: #selector(dummy),discoverabilityTitle: "dummy")
        let mainMenu = UIMenu(title: "Dummy",image: nil,identifier: UIMenu.Identifier("dummy"),options: .displayInline,children: [dummyCommand])
        builder.replace(menu: .application,with: mainMenu)
    }
}

我还尝试将应用程序置于全屏模式,但无济于事。

关于如何捕获.command修饰符的其他建议?

接下来,我将尝试通过AppKit捆绑软件捕获输入,但这并不理想。

非常感谢您!

解决方法

希望你已经有了答案,但万一没有: 您将需要使用如下代码检查印刷机

override func pressesBegan(_ presses: Set<UIPress>,with event: UIPressesEvent?) {

    var didHandleEvent : Bool = true
    print("presses began \(presses.count)")
    for press in presses {
        guard let key = press.key else { continue }

        if key.modifierFlags.contains(.command) {
            commandDown = true
            print("commandDown")
        }
     ...

如果除了您的代码之外,您还希望系统处理按键操作,您也应该只调用 super.pressesBegan。在您的情况下,我怀疑您不希望系统执行此操作,因此请跟踪您已处理的印刷机,并且只有在未处理的情况下才会调用 super。 您可能还想将视图控制器设置为 .becomeFirstResponder() (假设您使用的是 UIVIewController )