【发布时间】:2021-01-25 01:01:12
【问题描述】:
我正在为 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, 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 键事件的罪魁祸首,但没有任何改变:
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 包捕获输入,但这并不理想。
非常感谢!
【问题讨论】:
标签: macos command key catalyst modifier