2012-02-16 81 views
0

在我的程序中,我必須運行另一個應用程序(用OpenGL繪製一些東西),然後繪製它。用OpenGL繪製到另一個應用程序窗口

如何在Windows或Qt中執行此操作?

第一條解決方案,可以找到here

+0

請更具體和/或給我們一些示例代碼。 「在我的程序中我必須運行另一個應用程序」是什麼意思?你是否從你的程序開始一個新的過程? – tr9sh 2012-02-16 09:12:50

+0

目前沒有任何代碼。 「你是否從你的程序開始一個新的過程?」是的,我想是這樣。我選擇運行哪個程序(exe文件),獲取由該程序(通過opengl)繪製的圖像,將其用作紋理,進行一些變換並替換原始圖像。 – Jeka 2012-02-16 09:56:32

+0

@Jeka:你能再詳細一點嗎?你也應該知道,這樣做的解決方案(如鉤子已經回答)可以觸發反病毒/反作弊程序。 – KillianDS 2012-02-16 13:11:13

回答

0

運行另一個應用程序(它與OpenGl繪製水手),並繪製它。

得到這個程序繪製的圖像(通過opengl),將它用作紋理,進行一些變換並替換原始圖像。

這些是兩個完全不同的東西。根據進一步的說明,「最簡單」和「最乾淨」的方式(如果你可以稱之爲)根據進一步的說明做你明顯想要做的事情的方法是鉤wglSwapLayerBuffers(其中似乎是什麼SwapBufferswglSwapBuffers內部呼叫,你需要確認或者勾選全部三項)。

然後,您擁有一個有效的上下文句柄,並且在交換緩衝區時,您肯定(必然!)幀緩衝區內容是有效且一致的,不存在半繪製原語。因此,沒有什麼能阻止你回讀前面或後面的緩衝區(或兩者!),在它上面運行一些內核,然後在將控制權返回給應用程序之前寫回。

由於上下文句柄是唯一有效的過程,只有這樣,不僅能夠可靠地工作沒有麻煩,沒有一些真是可惡黑客(比這更討厭的是已經)是通過將假opengl32.dll,就像這樣的工具像GLIntercept一樣。
你也許可以從一個迷你調試器「竊取」手柄,但它不會對你的過程有效,所以沒有用。

但是...像datenwolf說:只是不這樣做。

+0

哦,看起來真的很討厭。所以像fraps這樣的程序(它表明FPS over program)以相同的方式工作? – Jeka 2012-02-16 12:26:31

+0

最有可能。實際的FPS _display_是微不足道的,這可以通過一個分層窗口來完成,除了GDI之外別無它法。但是由於知道FPS涉及知道何時(或多久)緩衝器被切換,所以他們可能需要做API掛鉤。唯一的選擇是閱讀一些特定於IHV的性能計數器,但這同樣麻煩且便攜性較差... – Damon 2012-02-16 12:53:30

+0

至少,我可以通過我的應用程序獲取圖像嗎?我應該使用鉤子來保持最新? – Jeka 2012-02-16 13:28:17

0

在Windows中只使用非常模糊和骯髒的黑客。我不推薦它。 Qt只是一個框架,依賴於底層的操作系統。在Windows上,所有的Windows限制都適用。

在X11上,你可以在兩種模式下創建的OpenGL上下文:直接或間接(見glXCreateContext和glXCreateNewContext的直接參數)。間接上下文可以在X客戶端之間共享,因爲對於X服務器,沒有進程或不同的客戶端。只有XID,OpenGL上下文就是其中之一。這允許您在連接到同一個X顯示的進程之間傳遞間接OpenGL上下文的XID。直接上下文繞過GLX協議,因此不能共享。

+0

「在Windows中只使用非常晦澀和骯髒的黑客」我理解它,但我真的需要它。Qt只是框架中我寫的項目的另一部分,所以我會在這個應用程序中使用它。 謝謝X11解釋,但它對我來說並不有趣。 – Jeka 2012-02-16 09:48:59

+0

@Jeka:我甚至不知道曾經在Win2k上工作過的破解是否仍然存在。實際上,您將自己的程序附加到另一個程序,就好像它是一個調試程序,並從其他程序的上下文中調用OS函數。這真的不是很可靠,而且很容易上班。將工作提供一個RPC接口的OpenGL功能。 – datenwolf 2012-02-16 14:49:34

相關問題