首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mac Catalyst无法使用pressesBegan覆盖捕获.command密钥修饰符

Mac Catalyst无法使用pressesBegan覆盖捕获.command密钥修饰符
EN

Stack Overflow用户
提问于 2020-10-10 07:52:31
回答 1查看 127关注 0票数 1

我正在开发一个用于iOS (和通过Mac Catalyst的MacOS )的远程桌面控制应用程序,它必须能够在应用程序处于前台时捕获设备上的所有键盘输入,包括Cmd键(相当于非Mac键盘上的超级/开始键),以便将它们发送到远程桌面。

我还没有试着看看一个带外接键盘的iOS设备是否能看到.command键的修饰,但当我启用了Mac Catalyst支持,并在我的Mac上安装了这个应用程序,并在AppDelegate中添加了以下方法时:

代码语言:javascript
运行
复制
    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, with: event)
    print(presses.first?.key, presses.first?.key?.modifierFlags)
}
override func pressesCancelled(_ presses: Set<UIPress>,
                               with event: UIPressesEvent?) {
    super.pressesCancelled(presses, with: event)
    print(presses.first?.key, presses.first?.key?.modifierFlags)
}

除了Cmd/Start/Super键也在组合键中之外,我几乎可以捕获任何我尝试过的组合键。当Cmd键在组合键中或单独按下时,绝对不会向应用程序发送任何内容。该事件似乎完全由Mac OS X保留和使用。

为了这篇文章的完整性,我想补充说,我也尝试过从应用程序中删除所有菜单,以防菜单是消耗Cmd键事件的罪魁祸首,但没有任何变化:

代码语言:javascript
运行
复制
    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包捕获输入,但这并不理想。

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2021-03-23 04:17:07

希望你已经有了答案,但以防万一:你会想要用下面的代码检查媒体

代码语言:javascript
运行
复制
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 )

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64288640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档