Cocoa应用程序的可执行文件是否可以从调用方窃取焦点?

时间:2011-02-17 17:14:30

标签: cocoa macos focus setfocus

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

open Foo.app/

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

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

Foo.app/Contents/MacOS/Foo

出现 。在检查时,应用程序确实已打开,但它没有聚焦(终端仍然是),我必须在扩展坞上找到它或找到它的窗口。

Foo应用程序在运行时是否有任何方法可以确保它的焦点?即使它通过如上所述的可执行文件运行?

5 个答案:

答案 0 :(得分:2)

您的应用可以通过调用

“窃取焦点”
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];

有关详细信息,请参阅NSApplication文档。

答案 1 :(得分:1)

你打算输入:

open -a /Applications/Foo.app/

请注意-a选项

答案 2 :(得分:1)

如果您在applicationWillFinishLaunching:内询问如何给予您的应用(您正在撰写)此行为,则可以致电[NSApp activateIgnoringOtherApps:YES]

答案 3 :(得分:0)

也许是AppleScript?

tell application "TextEdit"
    activate
end tell

答案 4 :(得分:0)

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

  1. 您可以通过键入open -a ApplicationName从终端启动任何应用程序(在LaunchServices中注册)(请注意,您不需要尾随“.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. 即使不通过直接调用可执行文件来“打开”,您也可以与某些应用程序进行交互;例如,尝试/Applications/Firefox.app/Contents/MacOS/firefox-bin —help
  5. 因此,如果您确实要确保命令行启动的应用程序处于焦点,请使用方法1或2。