2012-02-16 82 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

相关问题