在macOS 10.15上,当窗口失去焦点时,我的应用程序未从无线连接的Xbox控制器接收任何输入。最初,我尝试使用设置为GCController.extendedGamepad.valueChangedHandler
的运动处理程序。专注时,该应用程序将按预期工作,但是一旦我切换到另一个应用程序,它就会冻结。在我再次移动控制器之前,再次聚焦应用程序不会更新它。
func handleControllerDidConnectNotification(_ notification: NSNotification) {
let gameController = notification.object as! GCController
initialize(gameController)
}
func initialize(_ controller: GCController) {
print("Initializing")
if let extendedGamepad = controller.extendedGamepad {
extendedGamepad.valueChangedHandler = movementHandler
}
}
func movementHandler(_ gamepad: GCExtendedGamepad, _: GCControllerElement) {
let gps = gamepad.saveSnapshot()
// respond to input
}
想知道是否只是valueChangedHandler
未被调用,我尝试从计时器中手动提取值。
let t = Timer(timeInterval: 0.01, repeats: true, block: {_ in Example.run()})
t.tolerance = 0.01
RunLoop.current.add(t, forMode: .default)
class Example {
func run() {
let gps = GCController.controllers()[0].extendedGamepad!.saveSnapshot()
// respond to input
}
}
日志确认计时器确实在后台运行,但是除非从窗口中获取焦点,否则我从控制器快照读取的值不会更改。与我以前的行为相同。
我正在尝试制作一个将控制器输入映射到键盘/鼠标输入的应用程序,所以不用说这需要在后台工作。