集成功能与 CLI

BetterDisplay 提供多种应用集成选项,包括命令行、自定义 URL Scheme、HTTP 接口、通知中心和 macOS 快捷指令。

本文基于应用版本 v4.1.5。
本文中描述的部分功能需要 Pro 许可证

启用集成功能

集成功能可在 设置 > 应用程序 > 集成 下激活(CLI 和基于通知的集成默认已启用)。

集成设置
设置 > 应用程序 > 集成

控制集成

从应用版本 v3.5.3 开始,控制集成(通过脚本或网络控制显示器、接收器和其他设备)也可以在特定显示器/设备下进行配置。以下是一些关于如何配置网络控制的示例链接:

(注意:基于分布式通知中心的控制集成也可用。)

概述与语法

应用支持以下集成方式:

各种集成方式可以在应用设置中单独启用和禁用。

一个集成命令可以接收一个或多个操作以及零个或多个参数。参数可以有也可以没有关联的值。

命令行访问语法

./BetterDisplay operation [operation] [-parameter[=value]] [-parameter[=value]]

说明:

您也可以使用 betterdisplaycli 进行更简便的访问。通过 Homebrew 安装:

brew install waydabber/betterdisplay/betterdisplaycli

示例(两个命令都将名为 MyDisplay 的显示器亮度设置为 80%):

./BetterDisplay set -name=MyDisplay -brightness=0.8
betterdisplaycli set --name=MyDisplay --brightness=80%

自定义 URL Scheme 集成语法

BetterDisplay://operation[/operation (…)][?parameter[=value]][&parameter[=value]]

示例(原始 URL 和使用 open 命令的脚本访问,带正确转义):

BetterDisplay://set?name=MyDisplay&brightness=0.8
open BetterDisplay://set\?name=MyDisplay\&brightness=0.8

为保护访问安全,可以在设置中定义一个特殊令牌,然后必须通过 token= 参数包含在 URL 中。自定义 URL Scheme 集成支持 x-callback-url 来回报成功、错误和结果。更多信息:x-callback-url.com/specification

HTTP 集成语法

http://<hostname>:55777/command/[command/][?parameter[=value]][&parameter[=value]]

示例(原始 URL 和使用 curl 命令的脚本访问,带正确转义):

http://localhost:55777/set?name=MyDisplay&brightness=0.8
curl http://localhost:55777/set\?name=MyDisplay\&brightness=0.8

监听端口可在设置中自定义。以上示例使用 localhost 进行本地访问 — 远程调用时请使用适当的主机名。为保护访问安全,可以在设置中定义一个特殊令牌,然后必须通过 token= 参数包含在 URL 中。

在 URL 中可以使用 %20 替代空格。

操作(Operations)

操作定义了命令的解释方式。某些操作可以组合使用(例如 settoggleget 组合,同时设置和获取值)。

参数(Parameters)

参数影响操作的执行方式。某些参数可以相互混合使用。参数可以有也可以没有值。某些参数需要额外的参数才能工作。

设备识别与设备列表

设置或获取值

调用应用功能的参数

亮度与音量控制

硬件显示控制(DDC)

软件图像调整

显示模式与分辨率

HDR 与 XDR

色彩配置文件与连接模式

显示器布局与状态

虚拟屏幕管理

串流与画中画(PIP)

显示器保护设置

EDID 操作

帧缓冲色彩映射

信息检索

全局功能(非设备特定)

显示器组管理

DDC 直接访问参数

通过 CLI 直接访问 DDC

这可以作为 m1ddc 的替代方案(支持所有连接,包括 m1ddc 不支持的连接)。与 m1ddc 不同,DDC CLI 访问需要运行中的 BetterDisplay 进程。示例:

直接设置亮度:

curl http://localhost:55777/set\?namelike=gp27\&feature=ddc\&vcp=luminance\&value=50

使用不同风格(CLI 风格和十六进制数字):

./BetterDisplay set -namelike=gp27 -feature=ddc -vcp=0x10 -value=0x32

设置亮度值然后获取当前值、最小值(始终为 0)和最大值:

curl http://localhost:55777/set/get\?namelike=16p-l\&feature=ddc\&vcp=luminance\&value=30\&min\&max

获取亮度的当前值和最大值:

./BetterDisplay get -namelike=gp27 -feature=ddc -vcp=luminance -value -max

CLI 示例

与自定义控制交互(setgetfeedtoggleperform):

以下是包含各种 CLI 命令使用示例的讨论和评论:

更改显示模式:

色彩配置文件和 XDR 预设:

管理虚拟屏幕:

使用 -moveTo 移动显示器(也可使用 -placement 指定坐标)和配置镜像:

配置显示器保护设置:

配置 PIP 和串流:

EDID 操作:

配置连接色彩模式(Apple Silicon):

管理显示器组:

管理 Sidecar:

通过安装 betterdisplaycli 进行 CLI 访问

传统 CLI 操作可以通过应用包中嵌入的应用二进制文件访问。如果应用安装在 /Applications 下,可以使用绝对路径。例如,以下命令将打印帮助信息:

/Applications/BetterDisplay.app/Contents/MacOS/BetterDisplay help

为简化 CLI 访问,您可以安装 betterdisplaycli

betterdisplaycli help

该工具可通过以下方式安装:

基于 DistributedNotificationCenter 的第三方应用集成

BetterDisplay 可以使用 macOS 通知分发系统与第三方应用集成。

向 BetterDisplay 发送请求

以下 Swift 结构体定义了发送给 BetterDisplay 的通知必须符合的 JSON 数据结构:

struct IntegrationNotificationRequestData: Codable {
  var uuid: String?
  var commands: [String] = []
  var parameters: [String: String?] = [:]
}

字段说明

请求通知必须使用以下通知名称发送:

com.betterdisplay.BetterDisplay.request

示例代码

以下示例代码演示如何请求 BetterDisplay 将所有已连接显示器的亮度设置为 80%(0.8):

let integrationNotificationRequestData = IntegrationNotificationRequestData(
  uuid: UUID().uuidString,
  commands: ["set"],
  parameters: ["brightness": "0.8"]
)
do {
  let encoded = try JSONEncoder().encode(integrationNotificationRequestData)
  if let encodedString = String(data: encoded, encoding: .utf8) {
    DistributedNotificationCenter.default().postNotificationName(
      "com.betterdisplay.BetterDisplay.request",
      object: encodedString,
      userInfo: nil,
      deliverImmediately: true
    )
  }
} catch {}

接收 BetterDisplay 的响应

以下 Swift 结构体定义了 BetterDisplay 返回的响应 JSON 数据结构:

struct IntegrationNotificationResponseData: Codable {
  var uuid: String?
  var result: Bool?
  var payload: String?
}

字段说明

所有字段都是可选的。BetterDisplay 使用以下通知名称发送响应:

com.betterdisplay.BetterDisplay.response

betterdisplaycli 代码

请查看 betterdisplaycli,它是 BetterDisplay 的简单 CLI 工具,其代码也演示了如何使用通知分发进行应用集成。

OSD 通知分发集成

BetterDisplay 可以向第三方应用发送通知,这些应用可以使用此信息来呈现替代的 OSD GUI。此功能已在 MediaMateDynamicLakePro(3.0 及更新版本)中实现。

该功能必须在 设置 > 应用程序 > 集成 下启用才能工作:

OSD 通知集成设置
启用 OSD 通知分发集成

开发者信息

通知包含一个 JSON 文本数据,可以解码为以下结构:

struct OsdNotification: Codable {
  var displayID: Int? = nil       // 应在哪个显示器上显示 OSD
  var systemIconID: Int? = nil    // 1 - 亮度, 3 - 音量, 4 - 静音, 0 - 无图标
  var customSymbol: String? = nil // 使用自定义图标时的 SF Symbol 名称
  var text: String? = nil         // OSD HUD 中显示的附加文本
  var lock: Bool? = nil           // 同时显示锁定图标
  var controlTarget: String? = nil // 控制类型的进一步描述
  var value: Double? = nil        // OSD 值(刻度:0 到最大值)
  var maxValue: Double? = nil     // 最大值
  var symbolFadeAfter: Int? = nil // 次要符号淡出时间(毫秒)
  var symbolSizeMultiplier: Double? = nil // 符号大小调整
  var textFadeAfter: Int? = nil   // 文本淡出时间(毫秒)
}

所有值都是可选的。如果同时添加了系统图标和自定义符号,则自定义符号为次要符号。

controlTarget 目前可以有以下值,此信息帮助呈现应用进一步自定义 OSD 外观:

combinedBrightness / hardwareBrightness / softwareBrightness
volume / mute
hardwareContrast
redHardwareBlackLevel / greenHardwareBlackLevel / blueHardwareBlackLevel
redHardwareGain / greenHardwareGain / blueHardwareGain
gain / gamma / rGamma / gGamma / bGamma
temperature / contrast / blueLight / underscan

接收通知的方式很简单,只需添加一个观察者:

DistributedNotificationCenter.default.addObserver(
  self,
  selector: #selector(osdNotificationBetterDisplay),
  name: .init("com.betterdisplay.BetterDisplay.osd"),
  object: nil
)

@objc func integrationOsdNotification(notification: NSNotification) {
  guard let notificationString = notification.object as? String else { return }
  do {
    let osdNotification = try JSONDecoder().decode(
      OsdNotification.self,
      from: Data(notificationString.utf8)
    )
    // 处理 osdNotification
  } catch {}
}

更多注意事项:GitHub 讨论

App Intents 支持(macOS 快捷指令)

应用还通过 App Intents 框架支持 macOS 快捷指令应用。请注意,并非所有操作都可作为 App Intents 使用 — 对于高级用户,建议在快捷指令应用中使用 CLI。

一些通过终端命令可访问的额外应用设置

隐藏 PIP 窗口调整大小百分比信息:

defaults write pro.betterdisplay.BetterDisplay pipShowResizePercent NO

允许应用使用所有有效许可证激活:

defaults write pro.betterdisplay.BetterDisplay disallowActivationWithOutdatedLicense NO

启用 PIP 鼠标光标自动跳转:

defaults write pro.betterdisplay.BetterDisplay pipAutoWarp YES

启用屏幕串流鼠标光标自动跳转:

defaults write pro.betterdisplay.BetterDisplay screenStreamAutoWarp YES

禁用屏幕串流目标上的鼠标光环(虚线圆圈):

defaults write pro.betterdisplay.BetterDisplay screenStreamMouseHalo NO

应用菜单滑块出现时添加动画效果:

defaults write pro.betterdisplay.BetterDisplay sliderRevealAnimation YES