控制 macOS 触摸栏媒体键

Control macOS touchbar media keys

使用 CGEventTap 方式,我能够在我的应用程序中拦截媒体键 (F7 - F9) 并阻止打开 iTunes 等内容。但是,有没有办法更改显示的图标?例如,当在 safari 中播放 youtube 视频或在 iTunes 中播放音乐时,按钮会根据需要从 'play' 更改为 'pause',但在我的例子中它仍然是通用的 'play/pause' 按钮。

显然有一个 API 可以做到这一点,但我还没有找到它。

编辑:澄清一下,我不是在谈论任何应用程序都可以显示的“应用程序控件”触摸栏;相反,我说的是在系统偏好设置中选择“扩展控制条”时显示的触摸条——它在所有应用程序中都是全局的。

我找到了解决方案,它是MPRemoteCommandCenter。首先,您必须设置处理程序:

let remote = MPRemoteCommandCenter.shared()
remote.playCommand.isEnabled = true
remote.playCommand.addTarget { (MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus in 
    // ...
}

请注意,根据我的经验,您可能 需要为 playCommandpauseCommandtogglePlayPauseCommandnextTrackCommand 设置处理程序, 和 previousTrackCommand 才能让它工作。

然后,要实际更改按钮状态,请使用 MPNowPlayingInfoCenter.default().playbackState,可以是 .playing.paused 或其他。

然而,在我的例子中,因为我已经通过另一种机制连接了媒体按钮,所以我上面设置的处理程序什么都不做;他们只需要明显地在那里,这样 OS 就会知道您的应用程序。设置 playbackState 仍然有效。