API для обнаружения активного сеанса в Mac OS X с быстрым переключением пользователей - PullRequest
6 голосов
/ 15 декабря 2011

В Mac OS X Snow Leopard с включенным быстрым переключением пользователей, существует ли API для определения, запущено ли мое приложение в активном сеансе пользователя? То есть сеанс, подключенный к экрану и клавиатуре.

В порядке Objective-C или C ++.

Ответы [ 3 ]

4 голосов
/ 09 января 2012

Я избегал использования уведомлений о переключении пользователей и вместо этого нашел две другие возможности:

  1. Используйте CGMainDisplayID() от Core Graphics. Сохраняйте основной идентификатор дисплея при первом запуске приложения и продолжайте опрашивать его. Он изменится на другой идентификатор дисплея при переключении на другого пользователя. Проблема в том, что это также может измениться по другим причинам, например изменение того, какой дисплей является основным в многоэкранной настройке.

  2. Используйте CGSessionCopyCurrentDictionary() также из Core Graphics и получите логическое значение kCGSessionOnConsoleKey из словаря. Это указывает, присоединен ли ваш пользовательский сеанс к консоли.

Оба из них требуют опроса, но это хорошо для моих целей. Уведомления о переключении пользователей будут лучшим выбором, если вам нужно управлять событиями.

2 голосов
/ 15 декабря 2011

Из " Введение в многопользовательские среды " я могу думать только об одном, что может удовлетворить ваши потребности: уведомления о переключении пользователей.Поэтому, если ваше приложение запускается, оно должно быть в активном сеансе.Теперь вы можете использовать уведомление о смене пользователя для установки нового состояния, то есть того, что приложение больше не работает в активном сеансе.

0 голосов
/ 20 июня 2019

Это сработало для меня (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
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...