如何判断Mac Cocoa应用程序是正常启动还是作为登录项启动?

时间:2011-04-06 08:32:21

标签: cocoa macos

有没有办法告诉Cocoa应用程序是作为日志项启动而不是双击它?

6 个答案:

答案 0 :(得分:14)

如果在没有要打开或打印的文档的情况下启动应用程序,它将收到'oapp'(a.k.a。kAEOpenApplication)Apple事件。该事件可能具有属性数据(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
}

斯威夫特3:

let event = NSAppleEventManager.shared().currentAppleEvent
let launchedAsLogInItem =
    event?.eventID == kAEOpenApplication &&
    event?.paramDescriptor(forKeyword: keyAEPropData)?.enumCodeValue == keyAELaunchedAsLogInItem

答案 1 :(得分:2)

据我所知,没有正确的方法来检查这个,但有一些想法:

最佳解决方案:

创建两个不同的应用程序,例如TheApp和TheAppLauncher 将TheApp添加到应用程序文件夹,将TheAppLaucher添加到启动项目 启动TheAppLauncher时,只需使用特定标志启动TheApp 我希望这很清楚:))

其他'丑'选项:

检查应用程序是否实际列在登录项中:
https://github.com/carpeaqua/Shared-File-List-Example/

让应用程序记录它启动的确切时间 然后将其与用户上次登录时进行比较 finger 命令提供此信息(使用NSTask) 当差异很小时,它作为登录项启动了很好的改变 但是,是的,这并不完全可靠:)

答案 2 :(得分:2)

Chromium项目有some code to do this。按照此处拼写的方法,检查父进程和登录项列表。

答案 3 :(得分:1)

如果作为登录项启动,也许您可​​以使用选项启动应用程序。例如,当用作启动项时将其称为MyApp.app --startupItem,并在定期启动时调用它而不使用该选项。

命令行选项可以检查经典的C方式,因为它们作为参数传递给main函数。

答案 4 :(得分:1)

设置登录项,以便在启动应用程序时(awakeFromNib或init)检查“隐藏”,检查应用程序是否隐藏。

答案 5 :(得分:0)

根据您正在做的事情,NSApplicationLaunchIsDefaultLaunchKey在这里可能会有用。这是发送给NSNotification的{​​{1}}中包含的密钥。来自the documentation

  

此键的值是包含布尔值的NSNumber。如果应用程序启动以打开或打印文件,执行服务操作,应用程序已保存将要还原的状态,或者应用程序启动是否在某种其他意义上不是默认启动,则值为NO。否则其值为YES。

除了上述案例外,如果应用程序在登录时自动启动,它也会设置为applicationDidFinishLaunching:。因此,如果您决定是否显示某些界面元素,例如,这可能足以让您完成所需的信息。

如果您想知道应用是否在选中“隐藏”框的情况下启动,则检查NO也可能很有用。

编辑:在进一步测试中,我不确定这是否属实。正常打开应用时,[[NSApplication sharedApplication] isHidden]通常为NSApplicationLaunchIsDefaultLaunchKey。当它自动启动时,似乎通常是YES,在我到目前为止所做的测试中。但两者都不是真的,所以看来这个关键字可能没用。