2009-02-24 52 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

相關問題