Cocoa应用程序的可执行文件能否从调用方窃取焦点?
假设我有一个名为Foo.app的标准Cocoa应用程序,就像在Xcode中选择New Project>Cocoa Application时得到的一样,如果我通过终端使用以下命令打开该应用程序:Cocoa应用程序的可执行文件能否从调用方窃取焦点?,cocoa,macos,focus,setfocus,Cocoa,Macos,Focus,Setfocus,假设我有一个名为Foo.app的标准Cocoa应用程序,就像在Xcode中选择New Project>Cocoa Application时得到的一样,如果我通过终端使用以下命令打开该应用程序: open Foo.app/ 然后我在顶部的状态栏上看到了Foo的名字,它的窗口在所有其他应用程序的前面处于焦点位置 相反,如果我直接从终端调用埋在.app文件夹中的可执行文件,如: Foo.app/Contents/MacOS/Foo 似乎什么也没发生。在检查时,应用程序确实已经打开,但它不在焦点中。
open Foo.app/
然后我在顶部的状态栏上看到了Foo的名字,它的窗口在所有其他应用程序的前面处于焦点位置
相反,如果我直接从终端调用埋在.app文件夹中的可执行文件,如:
Foo.app/Contents/MacOS/Foo
似乎什么也没发生。在检查时,应用程序确实已经打开,但它不在焦点中。终端仍然在,我必须在码头上找到它或找到它的窗口
Foo应用程序在运行时是否有办法确保其处于焦点?即使它通过上面描述的可执行文件运行?也许是AppleScript
tell application "TextEdit"
activate
end tell
也许是AppleScript
tell application "TextEdit"
activate
end tell
你的意思是键入:
open -a /Applications/Foo.app/
注意-a选项您的意思是键入:
open -a /Applications/Foo.app/
注意-a选项至少有三种不同的方式可以从终端打开应用程序并与之交互 您可以从终端启动在LaunchServices中注册的任何应用程序,方法是键入open-一个不需要尾随.app或提供任何路径的应用程序名注释 您可以通过键入open/path/to/ApplicationName.app来打开一个提供其特定路径的应用程序。鉴于这些应用程序可能已经在LaunchServices中注册,您很少需要它 如果键入open/path/to/ApplicationName.app/Contents/MacOS/ApplicationName,则可以打开可执行文件并与之交互。这里的区别在于,对于某些应用程序,您可以在命令行上传递参数或随后与它们交互。例如,继续尝试打开/Applications/Mail.app/Contents/MacOS/Mail,它将返回一个调试日志 通过直接调用某些应用程序的可执行文件,即使不使用open,也可以与它们交互;试试/Applications/Firefox.app/Contents/MacOS/Firefox-bin——例如帮助。
因此,如果您确实希望确保命令行启动的应用程序处于焦点位置,请使用方法1或2。至少有三种不同的方式可以从终端打开应用程序并与之交互 您可以从终端启动在LaunchServices中注册的任何应用程序,方法是键入open-一个不需要尾随.app或提供任何路径的应用程序名注释 您可以通过键入open/path/to/ApplicationName.app来打开一个提供其特定路径的应用程序。鉴于这些应用程序可能已经在LaunchServices中注册,您很少需要它 如果键入open/path/to/ApplicationName.app/Contents/MacOS/ApplicationName,则可以打开可执行文件并与之交互。这里的区别在于,对于某些应用程序,您可以在命令行上传递参数或随后与它们交互。例如,继续尝试打开/Applications/Mail.app/Contents/MacOS/Mail,它将返回一个调试日志 通过直接调用某些应用程序的可执行文件,即使不使用open,也可以与它们交互;试试/Applications/Firefox.app/Contents/MacOS/Firefox-bin——例如帮助。
因此,如果您确实希望确保命令行启动的应用程序处于焦点位置,请使用方法1或2。如果您询问如何为您正在编写的应用程序提供此行为-在应用程序内WillFinishLaunching:您可以调用[NSApp activateIgnoringOtherApps:YES].如果您询问如何为您正在编写的应用程序提供此行为-在applicationWillFinishLaunching中:您可以调用[NSApp activateIgnoringOtherApps:YES]。您的应用程序可以通过调用
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
有关更多信息,请参阅文档。您的应用程序可以通过拨打电话窃取焦点
[[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
有关更多信息,请参阅文档。我希望不要求助于此。但目前这是最好的选择。。。看起来一个成熟的可可应用程序应该有能力做到这一点-谢天谢地,这个问题现在只提了10分钟:我希望不要求助于这个。但目前这是最好的选择。。。看起来一个成熟的可可应用程序应该有能力做到这一点-谢天谢地,这个问题现在只有10分钟了:不。。。他们做的事情或多或少是一样的。你不需要-a,事实上,你所写的不会与/after.app一起工作,你需要:open-a Foo.app,但这不是重点。我的问题的重点是避免使用open,让应用程序专注于自己的No。。。他们做的事情或多或少是一样的。你不需要-a,事实上,你所写的不会与/after.app一起工作,你需要:open-a Foo.app,但这不是重点。我的问题的重点是避免使用open,让应用程序专注于它自己为什么要覆盖正常的行为?我们正在制作一个可以从MATLAB shell调用的应用程序。正常行为在matlab窗口后打开。为什么要覆盖正常行为?我们正在制作一个可以调用的应用程序
从一个MATLAB外壳。正常行为是在matlab窗口后面打开的。注意,这将破坏其他应用程序在后台启动应用程序的能力,这可能是可取的。不清楚您为什么要强制执行此行为。请注意,这将破坏其他应用程序在后台启动您的应用程序的能力,这可能是可取的。不清楚您为什么要强制执行此行为。请注意,这将破坏其他应用程序在后台启动您的应用程序的能力,这可能是可取的。不清楚为什么要强制这种行为。谢谢,我将在命令行参数中使用它-stealFocus。因此,我可以从命令行脚本调用:Foo.app/Contents/MacOS/Foo-stealFocus-YES,它将窃取焦点。然后,作为后台应用程序的选项仍然是可能的。请注意,这将破坏其他应用程序在后台启动您的应用程序的能力,这可能是可取的。不清楚为什么要强制这种行为。谢谢,我将在命令行参数中使用它-stealFocus。因此,我可以从命令行脚本调用:Foo.app/Contents/MacOS/Foo-stealFocus-YES,它将窃取焦点。那么,作为后台应用程序的选项仍然是可能的。