我正在使用FireBreath创建一个跨浏览器插件,该插件使用一些本地库用于各自的平台(一些基于.NET的Windows用于Windows,而基于Objective-C的dylibs /用于Mac的框架)。本机库显示UI屏幕。为了提高可用性,如果用户具有多/扩展监视器设置,我希望本机UI与浏览器窗口当前所在的屏幕上显示。
如果可以检索具有浏览器窗口的监视器的标识符,则可以将其传递给可以配置为在该监视器上显示其UI的本机组件。我使用了FireBreath的getWindowPosition()方法来获取插件的rect坐标,并使用该信息来识别Windows平台中的正确监视器。
但是,无论浏览器窗口当前所在的监视器如何,Mac中返回的坐标似乎始终为0(或1)。我知道我们必须配置事件模型和绘图模型才能在Mac中使用它。我尝试过跟踪事件/绘图模型组合而没有太大成功。
1)Cocoa / CoreGraphics 2)Carbon / CoreGraphics
非常感谢这方面的任何帮助。如果有其他方法可以实现相同的目的,请分享。我想要实现的是识别当前活动的浏览器窗口驻留在Mac上的监视器。我不确定这一点,但也许可以在Objective-C级别实现这一点(在FireBreath级别没有任何变化)。另请注意,我想支持Safari,Firefox和Chrome浏览器。
答案 0 :(得分:1)
你不会喜欢这个答案,但只是说你不能在Mac上做到这一点。问题是,使用CoreGraphics,您只能使用CGContextRef,并且它不知道它将在何处绘制。在旧版浏览器中,通过利用一些内部实现细节来获取NSWindow在技术上是可行的,但是许多浏览器不再可能并且从未受过支持。
其他绘图模型是相同的; CoreAnimation你有一个CALayer,但它不知道它被吸引到哪个屏幕或监视器。我个人认为它也有点烦人,但我不知道有什么办法可以找出你的插件被渲染到哪个监视器,特别是因为大多数监视器实际上将缓冲区复制到其他东西并在不同的进程中渲染。
答案 1 :(得分:1)
我确实设法提出了一个解决方法,我只是在这里回复线程的完整性。正如@taxilian所解释的那样,使用窗口引用检索插件坐标是不可能的。作为替代方法,Javascript“Window”对象具有2个属性,称为“screenX”和“screenY”,它们返回浏览器窗口相对于屏幕的X和Y坐标。如果用户具有扩展的监视器设置,则这些是相对于完整扩展屏幕的绝对坐标。我们可以使用这些值来确定具有浏览器窗口的监视器(如果X坐标超出主监视器宽度的范围,则浏览器应该基本上位于扩展监视器上)。我们可以从Firebreath中检索DOM属性,如以下链接中所述:
http://www.firebreath.org/display/documentation/Invoking+methods+on+the+DOM