1

假设我有一个标准的 Cocoa 应用程序调用 Foo.app(就像你在 Xcode 中选择 New Project > Cocoa Application 得到的那样),如果我通过终端使用以下命令打开应用程序:

open Foo.app/

然后我在顶部的状态栏上看到了 Foo 的名字,它的窗口处于焦点,在所有其他应用程序的前面。

相反,如果我直接从终端调用埋在 .app 文件夹中的可执行文件,例如:

Foo.app/Contents/MacOS/Foo

似乎什么都没有发生。经检查,该应用程序确实已打开,但它不是焦点(终端仍然是),我必须在 Dock 上找到它或找到它的窗口。

Foo 应用程序有什么方法可以确保它在运行时处于焦点位置?即使它如上所述通过其可执行文件运行?

4

5 回答 5

2

您的应用可以通过调用“窃取焦点”

[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];

有关更多信息,请参阅NSApplication文档。

于 2011-02-17T22:11:26.830 回答
1

你的意思是输入:

open -a /Applications/Foo.app/

注意-a选项

于 2011-02-17T17:44:17.433 回答
1

如果您要询问如何为您的应用程序(您正在编写)提供这种行为 -applicationWillFinishLaunching:您可以在内部调用[NSApp activateIgnoringOtherApps:YES].

于 2011-02-17T21:32:14.910 回答
0

也许AppleScript?

tell application "TextEdit"
    activate
end tell
于 2011-02-17T17:22:00.603 回答
0

从终端打开(并与之交互)应用程序有(至少)三种不同的方式。

  1. 您可以通过键入从终端启动任何应用程序(在 LaunchServices 中注册)open -a ApplicationName(请注意,您不需要结尾的“.app”或提供任何路径)

  2. 您可以通过键入来打开一个给出其特定路径的应用程序open /path/to/ApplicationName.app(您很少需要这样做,因为这些应用程序可能已经在 LaunchServices 中注册了)

  3. 如果您键入.,您可以打开可执行文件并与之交互open /path/to/ApplicationName.app/Contents/MacOS/ApplicationName。这里的区别在于,对于某些应用程序,您可以在命令行上传递参数或与它们进行交互。继续尝试open /Applications/Mail.app/Contents/MacOS/Mail例如 - 它会给你一个调试日志作为回报。

  4. 即使不使用“open”,您也可以通过直接调用它们的可执行文件与某些应用程序进行交互;/Applications/Firefox.app/Contents/MacOS/firefox-bin —help例如尝试。

因此,如果您确实想确保命令行启动的应用程序处于焦点位置,请使用方法 1 或 2。

于 2011-02-17T20:08:10.757 回答