and*_*abs 3 macos cocoa objective-c nsapplication launch-services
当我学会了如何自己启动NSApplications时,我使用的代码(基于此处和此处)完成了
[NSApp activateIgnoringOtherApps:YES];
Run Code Online (Sandbox Code Playgroud)
这会在启动时强制应用程序到前端.
我想知道大多数其他应用程序的功能.我希望能够直接从二进制文件和应用程序包中运行程序,而且我没有使用Xcode来构建它(原始构建).所以我可以自然而然地说这种行为.
文档确实说Finder问题NO
,但是......为什么Finder?这不是一个从流程内部运行的方法,而不是外部的方法吗?(我无法控制选择.)那么Dock和其他可能的切入点呢?
我甚至竟然拆解10.8 NSApplicationMain()
来看看它做了什么,但据我所知,从32位版本开始,除非这个"轻启动"事情发出这个选择器,否则这个选择器永远不会被调用.
这个问题有答案吗?谢谢......如果这令人困惑,我很抱歉; 我试着尽可能清楚地说出来.
Ken*_*ses 10
应用通常根本不打电话-activateIgnoringOtherApps:
.而且,一般来说,不应该.当然,它不会出现NSApplicationMain()
,这与实际的应用启动过早和相当远.
应用程序是由发射服务正常启动(这是用来通过测定器,底座和/usr/bin/open
,以及任何其他应用程序,可能会打开你的还是你的哪一个处理文件).大致发生的事情是启动服务停用了调用它打开其他东西的应用程序,然后,在启动的应用程序中,Cocoa的内部执行类似(但不一定相同)的操作[NSApp activateIgnoringOtherApps:NO]
.这样,如果在这两个事件之间的间隔中没有激活任何其他内容,则启动的应用程序仅激活.如果该间隔很长(因为某些事情很慢)并且用户在此期间切换到了其他内容,那么您不希望从他们切换到的任何内容中窃取焦点.
您应该只[NSApp activateIgnoringOtherApps:YES]
响应用户请求在上下文中激活您的应用程序,该上下文不包括Launch Services自动停用当前应用程序.例如,如果有其本身变换成GUI应用程序(使用命令行程序-[NSApplication setActivationPolicy:]
或弃用TransformProcessType()
),然后运行该工具的用户意味着他们想要激活它.但终端是活跃的,只是因为运行你的程序而不会自动停用.因此,该计划必须重点关注.
如果您的程序是捆绑的应用程序,那么应该从命令行运行它/usr/bin/open
而不是直接执行bundle中的可执行文件.然后,你根本不需要打电话-activateIgnoringOtherApps:
,要传递什么价值的问题没有实际意义.