Mac OSX:如何知道应用程序是否在会话启动/登录时自动启动



我的应用程序的用户可以选择是否要(或不)在他们的会话启动时启动我的应用程序。

要做到这一点,我使用LSSharedFileListRef如下所述:如何使你的应用程序在登录时打开?

我现在想知道我的应用程序是否在会话启动时自动启动,或者通过点击dock中的图标。事实上,在这两种情况下,我必须采取不同的行动。

我有一种感觉,它是不可能使用通知的参数在以下委托方法来做到这一点:

- (void)applicationDidFinishLaunching:(NSNotification *)notification

我看到了以下帖子,但他们没有帮助:

我如何知道我的应用程序是如何在Mac OS上启动的?=>没有答案,除了一些链接到其他没有帮助的帖子…

知道用户是否启动了应用=>我不知道如何设置/获取这篇文章中定义的"Y"参数

Mac OS X:在登录时打开应用程序,而不显示主窗口=>处理在启动时隐藏或不显示主窗口的事实;我想要的更一般:如何知道应用程序是如何启动的?

有人能帮我吗?

谢谢!

如果应用程序设置为在启动时运行,它将运行(为什么不呢?)因此,您可以将应用程序开始时间保存在某个地方。在以后运行时(例如,用户退出应用程序并再次运行)检查是否有此参数,如果它晚于系统启动时间,则此应用程序此时不会自动运行。

你可以通过[NSProcessInfo systemUptime]查看系统启动时间

我会检查父进程ID。如果它等于1,则表示它在启动时被laund启动。

struct kinfo_proc info;
size_t length = sizeof(struct kinfo_proc);
int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid };
if (sysctl(mib, 4, &info, &length, NULL, 0) < 0)
    return OPProcessValueUnknown;
if (length == 0)
    return OPProcessValueUnknown;
 //info.kp_eproc.e_ppid is what you need 

如果你不能让@bioffe的答案工作,这里再多一点:

从:http://www.objectpark.net/parentpid.html

#include <sys/sysctl.h>
#define OPProcessValueUnknown UINT_MAX
//Returns the parent process id for the given process id (pid).
int OPParentIDForProcessID(int pid)
{
    struct kinfo_proc info;
    size_t length = sizeof(struct kinfo_proc);
    int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, pid };
    if (sysctl(mib, 4, &info, &length, NULL, 0) < 0)
        return OPProcessValueUnknown;
    if (length == 0)
        return OPProcessValueUnknown;
    return info.kp_eproc.e_ppid;
}

打开终端窗口,输入last | grep '^reboot' | awk 'END { print $3" "$4" "$5" "$6 }'以获得重启时间并匹配特定应用程序启动的时间,正如@AnoopVaidya指出的。

最新更新