如果你不在Objective-C应用程序中,如何将窗口置于前台?

9
是否有一种方法可以在应用程序之外创建“makeKeyAndOrderToFront”?
如果我在Safari中,在菜单栏中有一个菜单项与我的应用相关,当我按下此菜单项时,我想在前台显示我的应用程序窗口(makeKeyAndOrderToFront仅在您在应用程序中时才能实现这一点)。
我可以使用哪种方式?以及如何对该窗口进行动画处理(例如像Tweeties在atebits.com中添加新推文)。
谢谢!

请提供更多信息。请描述您的菜单扩展与应用程序的关系。您是否拥有菜单扩展和单独的应用程序,还是菜单扩展就是应用程序(并且它有一个隐藏的窗口)? - Joshua Nozzi
两个窗口在一个XIB文件中 - 两者使用相同的控制器。 - ahmet2106
1
这仍然太模糊了。 - Joshua Nozzi
5个回答

22

如你所发现,改变应用程序中的窗口顺序不会影响哪个应用程序处于活动状态。你可以通过激活它将你的应用程序置于前台:

[NSApp activateIgnoringOtherApps:YES];
如果您的应用程序有一个 dock 图标,它的行为类似于用户点击它。

1

使用AppleScript可以轻松使您的应用程序成为前台应用,但它不会执行任何动画效果。

tell application "System Events" to set frontmost of process "My Application" to true

0

如果你的应用程序已经连接到窗口服务器(如果它正在使用 AppKit 或 Carbon,那么它就会连接),你可以使用核心服务函数SetFrontProcess()将其置于前台。 SetFrontProcessWithOptions()可用于仅将您的应用程序中最前面的非浮动窗口置于前台。这些函数似乎可用于 64 位应用程序,但如果你的目标是 10.6+,你最好使用 NSRunningApplication。类似以下代码:

[[[NSRunningApplication
   runningApplicationsWithBundleIdentifier:ident] lastObject]
 activateWithOptions:0]

应该可以解决问题。


0
也许,如果我理解问题正确的话,实现你想要的最好方法是让你的应用程序响应一个苹果事件。在选择菜单项后,你可以发送该事件,这将把你的应用程序和所需的窗口置于前台。

0

如果有人需要关于Swift与ObjC的解决方案,这里有一个更新:

NSApp.activate(ignoringOtherApps: true)

这与13年前得到最高票的答案完全相同。唯一的区别是Swift与Objective-C。你的回答与Xcode 14.3或macOS 13.0无关。 - HangarRash
好的,编辑一下以确保它是一个关于Swift vs ObjC的回答。 - kittonian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接