4

当我学会如何自己启动 NSApplications 时,我使用的代码(基于此处此处)确实

[NSApp activateIgnoringOtherApps:YES];

这会在启动时强制应用程序位于最前面。

我想知道大多数其他应用程序是做什么的。我希望能够直接从二进制文件和应用程序包中运行程序,并且我没有使用 Xcode 来构建它(原始构建)。所以我宁愿这个行为自然,可以这么说。

文档确实说 Finder 问题NO,但是......为什么是 Finder?这不是从流程内部而不是外部运行的方法吗?(我无法控制选择。)那么 Dock 和其他可能的入口点呢?

我什至拆解了 10.8NSApplicationMain()以查看它做了什么,但据我所知,从 32 位版本中可以看出,除非这个“轻启动”的东西发出这个选择器,否则这个选择器永远不会被调用。

这个问题有答案吗?谢谢......如果这令人困惑,对不起; 我试图尽可能清楚地表达出来。

4

1 回答 1

14

应用程序通常根本不调用-activateIgnoringOtherApps:。而且,一般来说,不应该。当然,它不会出现在 中NSApplicationMain(),这与实际的应用程序启动关系太早且相当遥远。

应用程序通常由启动服务(Finder、Dock 和/usr/bin/open以及任何其他可能打开您的应用程序或您处理的文档所使用的应用程序)启动。大致发生的情况是,启动服务会停用调用它以打开其他内容的应用程序,然后在启动的应用程序中,Cocoa 的内部执行类似(但不一定相同)的操作[NSApp activateIgnoringOtherApps:NO]。这样,启动的应用程序只有在这两个事件之间的时间间隔内没有任何其他激活时才会激活。如果该间隔很长(因为某些东西很慢)并且用户同时切换到其他东西,那么您不想从他们切换到的任何东西中窃取焦点。

您应该只[NSApp activateIgnoringOtherApps:YES]在响应用户请求的情况下调用以在不包括启动服务自动停用当前应用程序的上下文中激活您的应用程序。例如,如果您有一个命令行程序将自己转换为 GUI 应用程序(使用-[NSApplication setActivationPolicy:]或弃用TransformProcessType()),那么运行该工具的用户意味着他们希望它处于活动状态。但是终端是活动的,不会因为运行你的程序而自发停用。因此,该程序必须窃取焦点。

如果您的程序是一个捆绑应用程序,那么应该从命令行运行它,/usr/bin/open而不是直接执行捆绑包中的可执行文件。然后,您根本不需要调用-activateIgnoringOtherApps:,传递什么值的问题没有实际意义。

于 2014-08-14T22:56:46.120 回答