2

有没有办法,最好向后兼容 Mac OS X 10.3,来判断系统偏好设置中是否激活了“旁白”?

4

4 回答 4

7

这似乎存储在 Universal Access 的首选项文件中。应用标识符是“com.apple.universalaccess”,包含 VoiceOver 开启或关闭标志的键是“voiceOverOnOffKey”。您应该能够使用 CFPreferences API 来检索它,如下所示:

CFBooleanRef flag = CFPreferencesCopyAppValue(CFSTR("voiceOverOnOffKey"), CFSTR("com.apple.universalaccess"));
于 2009-01-27T21:21:59.347 回答
3

If anyone has the same question, it could be good to know, that Voice Over status is accessible via convenient interface now:

NSWorkspace.shared.isVoiceOverEnabled
于 2019-03-11T13:46:48.313 回答
1

Based on Petes excellent answer I’ve created this Swift 4.2 solution, which I find much easier to read. I also think it’s more handy to use a computed property in this case instead of a function.

var hasVoiceOverActivated: Bool {

    let key = "voiceOverOnOffKey" as CFString
    let id = "com.apple.universalaccess" as CFString

    if let voiceOverActivated = CFPreferencesCopyAppValue(key, id) as? Bool {
        return voiceOverActivated
    }

    return false

}

VoiceOver and Accessibility in general are very important topics and it is sad that the lack of Apples documentation especially for macOS makes it so hard for developers to implement it properly.

于 2018-09-22T17:09:33.660 回答
0

Swift 4 中的解决方案如下:

func NSIsVoiceOverRunning() -> Bool {

  if let flag = CFPreferencesCopyAppValue("voiceOverOnOffKey" as CFString, "com.apple.universalaccess" as CFString) {
    if let voiceOverOn = flag as? Bool {
      return voiceOverOn
    }
  }

  return false
}

此外,要在 macOS 上使用 VoiceOver 发布文本通知,请执行以下操作:

let message = "Hello, World!"
NSAccessibilityPostNotificationWithUserInfo(NSApp.mainWindow!,
  NSAccessibilityNotificationName.announcementRequested,
  [NSAccessibilityNotificationUserInfoKey.announcement: message,
  NSAccessibilityNotificationUserInfoKey.priority:
  NSAccessibilityPriorityLevel.high.rawValue])
于 2018-08-31T15:21:19.203 回答