2009-02-24 50 views
19

问候!Mac OS X:一个进程可以渲染到另一个进程的窗口吗?

我目前正在将一个web浏览器插件从Win32移植到MacOSX。插件的一个特点是,当插件被加载时,它产生一个单独的进程,作为插件的“引擎”,并执行绘制操作到插件的窗口中(具体地说,通过将OpenGL上下文附加到父进程的窗口并在该上下文中执行OpenGL渲染命令)。我们这样做是因为插件通常作为浏览器进程中的线程加载,因此插件崩溃会导致整个浏览器崩溃。通过将“繁重”分解为单独的流程并保持插件代码非常纤薄,我们可以保护用户免受此类崩溃。

我想在MacOSX上保留这个子进程渲染器体系结构,但是我听到一个令人讨厌的传言(与Google Chrome浏览器有关),MacOSX不允许进程访问它窗口到另一个进程。我在这个领域的搜索一直没有结果;如果任何人对这个问题有任何的了解,并且可以提供一些关于如何实现这个目标的建议,或者是一个更加决定性的“不可能完成”的建议,那么这将非常有帮助。

谢谢你的帮助!

+0

这个发现可能是你的兴趣。 http://developer.apple.com/DOCUMENTATION/CoreFoundation/Conceptual/CFPlugIns/CFPlugIns.html – Jonathan 2009-02-28 00:41:30

+2

这与原始海报的要求没有任何关系。 – 2009-03-10 03:10:21

回答

9

我正在调查近一年前的解决方案。我开始在苹果的邮件列表线程数:

http://www.mail-archive.com/[email protected]/msg08056.html

HTTP:// WWW。 mail-archive.com/[email protected]/msg01878.html

http://lists.apple.com/archives/mac-opengl/2008/May/msg00099.html

我不得不恢复到一个使用CGWindowListCreateImage的解决方案,该解决方案使用了opengl进程窗口的屏幕截图并将其转换为位图以显示在主进程窗口中。由于像素数据从视频RAM传输到系统RAM,这远远没有效果。

我也尝试了一个浮动窗口解决方案。 opengl进程窗口悬浮在主进程窗口之上,并响应来自主窗口的鼠标移动。但是我拖拉滞后和窗口z顺序有问题。

你会认为NSWindowSharingReadWrite会做你所需要的,但当时实际上不存在doumentation/examples。

但也许事情在去年发生了变化。如果您发现任何新内容,请继续发帖!

好运

JC

3

一个进程中的窗口可以被另一个进程写入,看起来如果NSWindowSharingType设置为NSWindowSharingReadWrite。这是在豹添加。请注意,我自己并没有使用过这个功能,但是我会说它至少会为您删除“无法完成”的障碍;-)

5

下面是来自苹果公司的开发团队提供的整体答案。

在MacOSX 10.5和更早的版本中,基本上没有办法做到这一点,就像将OpenGL渲染上下文附加到另一个进程的窗口一样干净。在这些案例中,人们开发的黑客可能是最好的解决方案。

我们在MacOS 10.6中最接近的是the IOSurface system;在10.6中使用它似乎是最干净的解决方案。如果您希望渲染过程中的点击被渲染过程拦截,则必须自行将事件捆绑起来,并使用您最适合的任何方法将它们传递到渲染过程。

上IOSurface的更多信息可以在this StackOverflow entry

相关问题