【问题标题】:Make NSWindow appear in front when used with FireBreath与 FireBreath 一起使用时使 NSWindow 出现在前面
【发布时间】:2013-04-29 05:40:22
【问题描述】:

我正在使用 FireBreath 创建一个跨浏览器插件,该插件利用一些用于各自平台的本机库(一些用于 Windows 的基于 .NET 的 DLL 和用于 Mac 的基于 Objective-C 的 dylib/框架)。该库显示一个 UI,它最终应该出现在其他窗口的前面(特别是在浏览器窗口的前面)。对于 Windows,我使用 win32 API 来传递窗口处理程序并将其置于前台。目前这工作正常。但是,我目前无法为 Mac 找到合适的解决方法,因此该窗口总是出现在 Mac 的浏览器后面。这个问题有解决办法吗?

我尝试了以下方法但没有取得多大成功:

1) 将NSWindow的级别设置为更高的值(例如:NSFloatingWindowLevel)并调用orderFront方法。

2) 在 NSApp 中设置 activateIgnoringOtherApps 属性并调用 makeKeyAndOrderFront 方法。

非常感谢您在这方面的任何帮助。

【问题讨论】:

  • 也许 FireBreath 正在使用 LSBackgroundOnly 中的 Info.plist 使 OS X 小程序部分成为后台应用程序?如果设置好了,你的插件就不能出现在前面,AFAIK...
  • 一个 NPAPI 插件确实有一个 Info.plist,但它丝毫不会影响这样的事情。问题是你在别人的过程中,他们控制着所有的东西
  • 是的,这就是问题的原因。由于原生组件是由浏览器调用的,它们本质上是在浏览器提供的环境中运行的。我使用了一个小型测试应用程序 (Cocoa) 来测试本机组件的功能,并且那里一切正常。当使用 FireBreath 插件使用浏览器调用原生组件时会出现此问题。

标签: objective-c macos firebreath


【解决方案1】:

感谢大家的支持。我设法解决了这个问题,我在这里回复是为了确保线程的完整性。

这个问题是由 Objective-C 中的一个基本事实引起的,它与 FireBreath 无关。当调用方法将其置于前台时,NSWindow 中的窗口对象未初始化(nil)。修复后,只需将窗口级别设置为 NSFloatingWindowLevel 即可解决此问题。

【讨论】:

  • 嗨,当您提到“调用方法将其置于前台时,NSWindow 中的窗口对象未初始化(nil)”。你能显示一个小代码吗?我想我在这里面临同样的情况。我将 [[self window] set level ....] 放在 awakeFromNib 中,对吗?谢谢。
【解决方案2】:

我能想到的最好的选择是启动另一个流程来处理您的 UI 内容并跨越边界进行对话。在将 STDOUT 和 STDIN 与它通信之前,我已经完成了这项工作。

【讨论】:

  • 感谢您的信息。我之前尝试过使用管道在进程之间进行通信,但是我们可以使用单独的进程来管理 UI 吗?如果可能的话,你能分享一些示例代码吗?再次感谢。
  • 单独的进程必须创建自己的 UI,然后才能对其进行管理。它当然不能用于管理浏览器的 UI……事实上,这是你的问题。您的插件在与浏览器不同的进程中运行,因此它无法管理浏览器的 UI。不,我没有任何示例代码。
  • 感谢您的支持。我设法解决了这个问题,它是由 Objective-C 级别的一个根本错误引起的。另一方面,我看到您是 FireBreath 的主要维护者。在过去的 6 个月里,我一直在使用它,它为我的项目提供了很好的服务。感谢您为开发这个出色的框架所做的努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 2019-08-25
  • 2011-06-19
  • 2021-02-28
相关资源
最近更新 更多