6

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

为此,我使用 LSSharedFileListRef ,如下所述:How do you make your App open at login?

我现在想知道我的应用程序是在会话启动时自动启动还是通过单击 Dock 中的图标启动。确实,在这两种情况下,我必须采取不同的行动。

我感觉不可能在下面的委托方法中使用通知的参数来做到这一点:

- (void)applicationDidFinishLaunching:(NSNotification *)notification

我看过以下帖子,但它们没有帮助:

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

知道用户是否启动了应用程序=> 我不知道如何设置/获取本文中定义的“Y”参数

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

任何人都可以帮助我吗?

谢谢 !

4

4 回答 4

2

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

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

于 2013-01-04T22:44:57.330 回答
2

我会检查父进程 ID。如果它等于 1,则表示它是由 launchd 在启动时启动的。

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 
于 2013-01-04T22:47:30.467 回答
1

如果你不能得到@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;
}
于 2013-04-20T22:02:51.793 回答
0

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

于 2013-01-04T22:28:14.200 回答