控制 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
// ...
}
请注意,根据我的经验,您可能 需要为 playCommand
、pauseCommand
、togglePlayPauseCommand
、nextTrackCommand
设置处理程序, 和 previousTrackCommand
才能让它工作。
然后,要实际更改按钮状态,请使用 MPNowPlayingInfoCenter.default().playbackState
,可以是 .playing
或 .paused
或其他。
然而,在我的例子中,因为我已经通过另一种机制连接了媒体按钮,所以我上面设置的处理程序什么都不做;他们只需要明显地在那里,这样 OS 就会知道您的应用程序。设置 playbackState
仍然有效。
使用 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
// ...
}
请注意,根据我的经验,您可能 需要为 playCommand
、pauseCommand
、togglePlayPauseCommand
、nextTrackCommand
设置处理程序, 和 previousTrackCommand
才能让它工作。
然后,要实际更改按钮状态,请使用 MPNowPlayingInfoCenter.default().playbackState
,可以是 .playing
或 .paused
或其他。
然而,在我的例子中,因为我已经通过另一种机制连接了媒体按钮,所以我上面设置的处理程序什么都不做;他们只需要明显地在那里,这样 OS 就会知道您的应用程序。设置 playbackState
仍然有效。