检测是否正在 macOS 上录制屏幕

Sin*_*hus 9 cocoa nswindow nsstatusitem screen-recording swift

我正在寻找一种方法来检测当前是否正在录制屏幕。
理想情况下,记录开始/停止时的事件。也许某种分布式通知。

我的用例是我想在记录屏幕时隐藏我的应用程序的菜单栏项(选择加入),因为它显示日期和时间,而且许多用户不希望屏幕记录中包含时间。

我试着设置NSWindow#sharingType.noneNSStatusBarButton窗口,但该选项似乎只对截图的工作。

答案应该在 Swift 中。

Cor*_*ell 1

我对此有一个可行的答案,依靠 AppleScript 来查询 QuickTime Player。对于强化运行时沙盒应用程序来说,这需要一些努力,包括权利以及提示用户授予对您的应用程序的访问权限以编写 QuickTime Player 脚本的特殊 plist 键。

如果这些都不是问题,那么这里有一个小类,用于检测 QuickTime Player 是否正在运行,如果正在运行,则发送一个 AppleScript 来查询“屏幕录制”文档。如果正在进行屏幕录制(不仅仅是打开待录制),则文档的当前时间将大于 0,脚本结果将为 true,否则将为 false。在尝试脚本之前还会检查 QuickTime Player 是否正在运行;如果不是,则返回 false。

import Cocoa

class ScreenRecordingCheck {
    static let qt_query_applescript = """
tell application id "com.apple.QuickTimePlayerX"
    set isScreenRecording to false
    repeat with doc in documents
        set docname to name of doc
        if docname is "Screen Recording" then
            set doctime to current time of doc
            set isScreenRecording to doctime is greater than 0.0
        end if
    end repeat
    set result to isScreenRecording
end tell
"""

    var scriptObj: NSAppleScript?

    init() {
        self.scriptObj = NSAppleScript(source: ScreenRecordingCheck.qt_query_applescript)
    }

    func isScreenRecordingActive() -> Bool {
        var result = false
        if !self.isQuicktimePlayerRunning() {
            return false
        }
        if let script = self.scriptObj {
            var errDictionary: NSDictionary?
            let scriptResult = script.executeAndReturnError(&errDictionary)
            if let err = errDictionary {
                Swift.print("Error: " + String(describing:err))
            } else {
                result = scriptResult.booleanValue
            }
        }
        return result
    }

    func isQuicktimePlayerRunning() -> Bool {
        let qtapps = NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.QuickTimePlayerX")
        return !qtapps.isEmpty
    }
}
Run Code Online (Sandbox Code Playgroud)

要在沙盒应用程序中启用此功能,您需要将此密钥添加到应用程序的 Info.plist 中:

<key>NSAppleEventsUsageDescription</key>
<string>Please give ScreenRecordingDetector access to Quicktime Player via Apple Script.</string>
Run Code Online (Sandbox Code Playgroud)

...以及应用程序的 .entitlements 文件中的此条目:

<key>com.apple.security.temporary-exception.apple-events</key>
<string>com.apple.QuickTimePlayerX</string>
Run Code Online (Sandbox Code Playgroud)

除了检查应用程序目标的签名和功能/强化运行时下的Apple 事件复选框。