1

我正在使用 FireBreath 创建一个跨浏览器插件,该插件利用一些用于各自平台的本机库(一些用于 Windows 的基于 .NET 的 DLL 和用于 Mac 的基于 Objective-C 的 dylibs/框架)。本机库显示 UI 屏幕。为了提高可用性,如果用户有一个多/扩展监视器设置,我希望本机 UI 显示在与当前浏览器窗口相同的屏幕上。

如果可以检索带有浏览器窗口的监视器的标识符,则可以将其传递给可以配置为在该监视器上显示其 UI 的本机组件。我已经使用 FireBreath 的 getWindowPosition() 方法来获取插件的矩形坐标,并使用该信息来识别 Windows 平台中的正确监视器。

但是,无论浏览器窗口当前所在的监视器如何,Mac 中返回的坐标似乎始终为 0(或 1)。我知道我们必须配置一个事件模型和一个绘图模型才能在 Mac 中工作。我尝试了以下事件/绘图模型组合,但没有取得多大成功。

1) 可可/CoreGraphics 2) 碳/CoreGraphics

非常感谢这方面的任何帮助。如果还有其他方法可以实现相同的效果,也请分享。我想要实现的是识别 Mac 中当前活动浏览器窗口所在的监视器。在这一点上我不确定,但也许可以在 Objective-C 级别实现这一点(在 FireBreath 级别没有任何更改)。另请注意,我想支持 Safari、Firefox 和 Chrome 浏览器。

4

2 回答 2

1

我确实设法想出了一个解决方法,我只是在这里回复线程的完整性。正如@taxilian 解释的那样,无法使用窗口引用检索插件坐标。作为一种替代方法,Javascript 'Window' 对象有 2 个属性,称为 'screenX' 和 'screenY',它们返回浏览器窗口相对于屏幕的 X 和 Y 坐标。如果用户有一个扩展显示器设置,这些是相对于整个扩展屏幕的绝对坐标。我们可以使用这些值来确定带有浏览器窗口的监视器(如果 X 坐标超出主监视器的宽度范围,则浏览器本质上应该位于扩展监视器上)。我们可以从 Firebreath 中检索 DOM 属性,如以下链接中所述:

http://www.firebreath.org/display/documentation/Invoking+methods+on+the+DOM

于 2013-08-18T18:49:57.117 回答
1

你不会喜欢这个答案,但简单地说你不能在 Mac 上这样做。问题是,使用 CoreGraphics,您只能使用 CGContextRef,它不知道将在哪里绘制。在较旧的浏览器中,通过利用一些内部实现细节来获得 NSWindow 在技术上是可行的,但是许多浏览器不再可能并且从未支持过。

其他绘图模型相同;CoreAnimation 你有一个 CALayer 但它不知道它被绘制到哪个屏幕或监视器。我个人认为这也有点烦人,但我不知道有什么方法可以找出你的插件被渲染到哪个监视器,特别是因为它们中的大多数实际上将缓冲区复制到其他东西并在不同的进程中渲染。

于 2013-08-16T15:48:03.133 回答