Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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
C++ 在现有图形应用程序上绘制DirectX/OpenGL图形_C++_Windows_Opengl_Directx_Dll Injection - Fatal编程技术网

C++ 在现有图形应用程序上绘制DirectX/OpenGL图形

C++ 在现有图形应用程序上绘制DirectX/OpenGL图形,c++,windows,opengl,directx,dll-injection,C++,Windows,Opengl,Directx,Dll Injection,首先,让我立即道歉,以防这个问题已经得到回答,因为我可能只是在不规则的搜索条件下搜索它 我希望在一个应用程序中绘制2D图形,该应用程序使用DirectX绘制自己的图形(游戏)。我将通过向应用程序中注入一个DLL(这部分我没有问题,我可以做到),并绘制我的图形来实现这一点。但我并不擅长DirectX/OpenGL,我有几个基本问题要问 1) 为了在该窗口上绘制图形,我是否需要从进程内存中获取预先存在的上下文,某种绘图场景的句柄 2) 如果应用程序使用DirectX,我可以在其上使用OpenGL图形

首先,让我立即道歉,以防这个问题已经得到回答,因为我可能只是在不规则的搜索条件下搜索它

我希望在一个应用程序中绘制2D图形,该应用程序使用DirectX绘制自己的图形(游戏)。我将通过向应用程序中注入一个DLL(这部分我没有问题,我可以做到),并绘制我的图形来实现这一点。但我并不擅长DirectX/OpenGL,我有几个基本问题要问

1) 为了在该窗口上绘制图形,我是否需要从进程内存中获取预先存在的上下文,某种绘图场景的句柄

2) 如果应用程序使用DirectX,我可以在其上使用OpenGL图形吗

请让我知道我如何处理这个问题。如有任何详细信息,将不胜感激:-)
提前感谢您。

您注入DLL的方法确实是正确的。像FRAP这样的项目使用同样的方法。我不能告诉您Direct3D的方法,但对于OpenGL,您可以做以下几件事:

首先,您必须连接到
opengl32.dll
的函数
wglMakeCurrent
glFinish
wglSwapBuffers
,以便在选择OpenGL上下文进行绘图时,dll会注意到。将他们的呼叫传递到操作系统。调用
wglMakeCurrent
时,使用函数
GetPixelFormat
查看窗口是否为双缓冲区。还可以使用
glGet…
OpenGL调用找出您正在处理的OpenGL上下文的哪个版本。如果您有一个传统的OpenGL上下文,您必须使用不同的方法来绘制覆盖,而不是现代OpenGL-3或更高版本的核心上下文

如果是双缓冲窗口,请使用
wglSwapBuffers
上的钩子执行进一步的OpenGL绘图操作。OpenGL只是在画布上画笔和画笔(以点、线和三角形的形式)。然后通过
wglSawpBuffers
调用使所有内容可见

如果是单缓冲上下文而不是
wglSwapBuffers
,则钩住的函数是
glFinish

使用OpenGL绘制2D与禁用深度缓冲和使用正交投影矩阵一样简单。您可以随时更改OpenGL状态。在离开挂钩之前,请确保将所有内容恢复到其原始状态。

“1)为了在该窗口上绘制图形,我是否需要从进程内存中获取预先存在的上下文,某种绘图场景的句柄?”

是的,您需要确保钩子捕获重要的上下文创建函数。 例如,您对d3d中CreateDevice的所有变体都感兴趣

您没有提到您正在使用哪个DirectX,但是版本之间存在一些差异。 例如,在DirectX 9上,您最感兴趣的功能是: 1.创建/返回IDirect3DSwapChain9对象 2.创建/返回IDirect3DDevice9、IDirect3DDevice9Ex对象

在较新版本的DirectX中,他们的代码被分成(主要)设备、DeviceContext和DXGI。 如果您正在执行“特定任务”,请共享您正在处理的directx版本

除了捕获所有需要的对象以允许自己进行渲染外,还需要捕获所有表示事件(GL中的“SwapBuffers”,DX中的“Present”), 因为那是你想要添加覆盖的时候了

由于您似乎正在尝试在DX应用程序上渲染覆盖,请允许我警告您,制作一个真正通用的解决方案(适用于所有游戏)并不容易。 主要是因为需要支持不同的DX版本以及多种创建方法 如果你专注于一个特定的游戏/应用程序,自然会容易得多

2.如果应用程序使用DirectX,我可以在其上使用OpenGL图形吗

嗯,首先是的。这是可能的。 您要搜索的术语是OpenGL DirectX互操作性(简称互操作性)

下面是一个例子: 我不知道他们使用的扩展是否只在nVidia设备中可用-检查它

关于这一点的另一件事是,为了做到这一点,你需要一个非常好的动机,通常我会坚持使用DX进行挂钩和渲染。 我认为不同DX版本之间的内部互操作是更好的选择。 我个人可能会使用DirectX9来编写自己的渲染代码。 当然,如果只需要支持单个DirectX版本,则不需要互操作

奖金: 如果您需要生成C++类的完整包装器,则可以使用“N”脏的DLL包装器,或者只是通用的全局函数钩子,可以自由使用我创建的这个库。 它远不是一个经过充分测试的工具,只是我在两天内破解的东西,但我发现它非常有用

注意,在您的情况下,我建议只使用VTable挂钩,您可能需要将函数offset硬编码到表中,但这不太可能改变


祝你好运:)

我的目标是DirectX9,我在挂钩等方面没有问题,我有自己创建的引擎,我的目标是特定的游戏。我想现在我最缺少的是一个关于DirectX9的速成课程。我觉得我现在是我自己的局限,因为我从这两个回复中得到了我需要的答案。您是否有任何DirectX9链接可以作为绘制我的覆盖图的速成课程?code sampler是一个不错的网站,DX SDK也提供了一些示例,但它们通常都包含大量不相关的代码。像gamedev.net这样的网站充满了初级/高级论坛。能够完全使用自己的高级图形代码通常需要多年的经验,但这确实是值得的!如果你能更具体地说明你想在游戏中做什么类型的gfx,也许我能提供更多的帮助。基本上我没有