【问题标题】:API to detect active session in Mac OS X with fast user switch使用快速用户切换检测 Mac OS X 中的活动会话的 API
【发布时间】:2012-01-21 02:06:08
【问题描述】:

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

Objective-C 或 C++ 都可以。

【问题讨论】:

    标签: c++ objective-c macos


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          • 2018-12-11
          • 2019-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多