Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用FireBreatch中的浏览器窗口识别监视器_Objective C_Macos_Firebreath - Fatal编程技术网

Objective c 使用FireBreatch中的浏览器窗口识别监视器

Objective c 使用FireBreatch中的浏览器窗口识别监视器,objective-c,macos,firebreath,Objective C,Macos,Firebreath,我正在使用FireBreath创建一个跨浏览器插件,该插件使用了相应平台的一些本机库(一些基于.NET的DLL用于Windows,一些基于Objective-C的dylibs/frameworks用于Mac)。本机库显示UI屏幕。为了提高可用性,如果用户具有多/扩展监视器设置,我希望本机UI与当前打开的浏览器窗口显示在同一屏幕上 如果可以通过浏览器窗口检索到监视器的标识符,则该标识符可以传递给本机组件,本机组件可以配置为在该监视器上显示其UI。我使用了FireBreath的getWindowPo

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

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

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

1) 可可粉/岩芯图形 2) 碳/芯图形


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

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


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

我确实找到了解决方法,我只是在这里回答线程的完整性。正如@taxilian所解释的,使用窗口引用检索插件坐标是不可能的。作为一种替代方法,Javascript“Window”对象有两个名为“screenX”和“screenY”的属性,它们返回浏览器窗口相对于屏幕的X和Y坐标。如果用户有扩展监视器设置,则这些是相对于整个扩展屏幕的绝对坐标。我们可以使用这些值确定带有浏览器窗口的监视器(如果X坐标超出主监视器宽度的边界,则浏览器基本上应位于扩展监视器上)。我们可以从Firebreath检索DOM属性,如下链接所述:


谢谢您提供的信息。我确实设法想出了一个变通办法,下面将对此进行解释。