用于通过快速用户切换检测Mac OS X中的活动会话的API

时间:2011-12-15 11:04:54

标签: c++ objective-c macos

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

Objective-C或C ++都可以。

3 个答案:

答案 0 :(得分:4)

我避免使用用户交换机通知,而是找到了另外两种可能性:

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

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

  3. 这两个都需要投票,但这对我的目的来说很好。如果您需要事件驱动,用户切换通知将是更好的选择。

答案 1 :(得分:2)

从“Introduction to Multiple User Environments”我只能想到一件可以满足您需求的东西:用户切换通知。因此,如果您的应用程序启动它,则必须处于活动会话中。现在您可以使用用户切换通知来设置新状态,即。即应用程序不再在活动会话中运行。

答案 2 :(得分:0)

这对我有用(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
    )