问题描述
我正在为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 )