API检测活跃的会话在Mac OS X与快速用户切换

API to detect active session in Mac OS X with fast user switch

本文关键字:用户 OS 活跃 检测 会话 Mac API      更新时间:2023-10-16

在Mac OS X雪豹上启用了快速用户切换,是否有API来检测我的应用程序是否在活动用户会话中运行?即当前连接到屏幕和键盘的会话。

Objective-C或c++都可以

我避免使用用户切换通知,而是发现了其他两种可能性:

  1. 使用Core Graphics中的CGMainDisplayID()。在应用程序第一次启动时存储主显示ID并继续轮询它。当切换到另一个用户时,它将更改为不同的显示ID。这样做的问题是,它也可能因为其他原因而改变,例如,在多屏幕设置中改变哪个显示器是主显示器。

  2. 也使用Core Graphics中的CGSessionCopyCurrentDictionary(),并从字典中检索kCGSessionOnConsoleKey布尔值。这表明您的用户会话是否附加到控制台。

这两种方法都需要轮询,但这对我的目的来说很好。如果你需要事件驱动,用户切换通知将是一个更好的选择。

从"多用户环境介绍"我只能想到一件事可以满足您的需求:用户切换通知。因此,如果应用程序启动,它显然必须处于活动会话中。现在您可以使用用户切换通知来设置新状态,即应用程序不再在活动会话中运行。

这对我有效(10.14/Swift 4)

        //Fast user switch out
    NSWorkspace.shared.notificationCenter.addObserver(
        self,
        selector: #selector(becameInactive),
        name: NSWorkspace.sessionDidResignActiveNotification,
        object: nil
    )
    //Fast user switch bak in
    NSWorkspace.shared.notificationCenter.addObserver(
        self,
        selector: #selector(becameActive),
        name: NSWorkspace.sessionDidBecomeActiveNotification,
        object: nil
    )
    // Switching workspace (spaces)
    NSWorkspace.shared.notificationCenter.addObserver(
        self,
        selector: #selector(workspaceSwitched),
        name: NSWorkspace.activeSpaceDidChangeNotification,
        object: nil
    )