Как определить, нормально ли запущено приложение Mac Cocoa или как элемент входа? - PullRequest
11 голосов
/ 06 апреля 2011

Есть ли способ узнать, было ли приложение Какао запущено как элемент журнала, а не дважды щелкнув по нему?

Ответы [ 6 ]

14 голосов
/ 10 ноября 2013

Когда приложение запускается без документа для открытия или печати, оно получает событие Apple 'oapp' (a.k.a. kAEOpenApplication). Это событие может иметь параметр данных свойства (keyAEPropData). Для обычного запуска этот параметр отсутствует или равен 0. Для запуска из элемента входа это keyAELaunchedAsLogInItem. (Когда ваше приложение запускается для предоставления услуги, оно keyAELaunchedAsServiceItem.)

https://developer.apple.com/legacy/library/documentation/Carbon/Reference/Apple_Event_Manager/index.html#//apple_ref/doc/constant_group/Launch_Apple_Event_Constants

Вы можете проверить это с помощью следующего кода в вашем методе -applicationWill/DidFinishLaunching::

NSAppleEventDescriptor* event = [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent];
if ([event eventID] == kAEOpenApplication &&
    [[event paramDescriptorForKeyword:keyAEPropData] enumCodeValue] == keyAELaunchedAsLogInItem)
{
    // you were launched as a login item
}

Swift 3:

let event = NSAppleEventManager.shared().currentAppleEvent
let launchedAsLogInItem =
    event?.eventID == kAEOpenApplication &&
    event?.paramDescriptor(forKeyword: keyAEPropData)?.enumCodeValue == keyAELaunchedAsLogInItem
2 голосов
/ 23 января 2013

В проекте Chromium есть некоторый код для этого . Следует изложенному здесь подходу, проверяя родительский процесс и список элементов входа в систему.

2 голосов
/ 06 апреля 2011

Насколько я знаю, нет правильного способа проверить это, но есть некоторые мысли:

Лучшее решение:

Создайте два разных приложения, например, TheApp и TheAppLauncher.
Добавьте TheApp в папку приложений и TheAppLaucher в элементы автозагрузки.
Просто запустите TheApp с определенным флагом при запуске TheAppLauncher.
Я надеюсь, что это понятно :)

Другой «уродливый» вариант:

Проверьте, действительно ли приложение указано в элементах входа в систему:
https://github.com/carpeaqua/Shared-File-List-Example/

Сделать журнал приложения точным временем его запуска.
Затем сравните его с последним входом пользователя в систему.
Команда finger предоставляет эту информацию (используйте NSTask).
Хорошее изменение, оно запускается как элемент входа в систему, когда разница невелика.
Но да, это не совсем надежно:)

1 голос
/ 09 октября 2011

Настройте элемент входа в систему таким образом, чтобы при каждом запуске приложения (awakeFromNib или init) проверялась опция «Скрыть», а затем проверялась, является ли приложение скрытым или нет.

1 голос
/ 06 апреля 2011

Может быть, вы могли бы запустить приложение с опцией, если запускаться как элемент входа в систему.Например, назовите его MyApp.app --startupItem, когда он используется в качестве элемента запуска, и вызывайте его без этой опции, когда он регулярно запускается.

Параметры командной строки можно проверить классическим способом C, так как они передаются в main функция в качестве аргументов.

0 голосов
/ 11 сентября 2012

В зависимости от того, что именно вы делаете, NSApplicationLaunchIsDefaultLaunchKey может быть полезно здесь. Этот ключ включен в NSNotification, отправленный на applicationDidFinishLaunching:. С документация :

Значением этого ключа является NSNumber, содержащий логическое значение. Значение равно NO, если приложение было запущено для открытия или печати файла, для выполнения действия службы, если приложение сохранило состояние, которое будет восстановлено, или если запуск приложения в каком-то другом смысле не был запуском по умолчанию. В противном случае его значение будет ДА.

В дополнение к упомянутым случаям оно также установлено на NO, если приложение автоматически запускается при входе в систему. Так что, если вы решаете, показывать ли какой-либо элемент интерфейса, например, этой информации может быть достаточно, чтобы делать то, что вам нужно.

Проверка [[NSApplication sharedApplication] isHidden] также может быть полезна, если вы хотите узнать, было ли приложение запущено с установленным флажком «скрыть».

Редактировать: При дальнейшем тестировании я не уверен, что это действительно так. Когда приложение открывается нормально, NSApplicationLaunchIsDefaultLaunchKey обычно YES. Когда он запускается автоматически, он обычно равен NO в тестировании, которое я провел до сих пор. Но ни то, ни другое не всегда верно, так что, похоже, этот ключ может оказаться бесполезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...