在游戏(OpenGL或DirectX)屏幕上读取像素

4
我想读取游戏(使用OpenGL或DirectX)中给定位置的像素颜色,通过第三方应用程序(这不是我的游戏)。
我尝试使用C#来实现它,代码可用于读取桌面、窗口等的颜色,但是当我启动游戏时,我只得到#000000,即黑色像素。我认为这是因为我没有在正确的“位置”读取,或者类似的原因。
有人知道如何做到这一点吗?我提到了C#,但C/C++也可以。

你现在是如何读取颜色的?你使用了哪些方法?因为我在使用Windows的放大镜辅助工具时遇到了类似的问题,桌面和其他窗口都可以正常显示,但任何绕过Windows API并直接绘制到屏幕上的内容(例如大多数游戏)都会显示为空白/黑色。或者更确切地说,任何直接绘制到叠加层的内容,如果这是正确的术语的话。 - JAB
5
哦,我们来了;我没有解决方案,但我很确定我找到了你的问题所在。http://en.wikipedia.org/wiki/Hardware_overlay “由于使用硬件叠加,屏幕截图程序(例如Windows内置的程序,当用户按下PrtSc键时激活)通常无法捕获出现在硬件叠加窗口中的内容。相反,将捕获一个仅包含特殊掩码颜色的空白区域。”因此,您可能需要查看DirectX和OpenGL,以了解它们可用的方法。 - JAB
2个回答

0
在Windows系统中,有一个名为GDI(图形设备接口)的库。使用GDI可以轻松地获取设备上下文,只需使用HDC dc = GetDC(NULL);就可以了,并且通过COLORREF color = GetPixel(dc, x, y);读取像素值。但是要小心:在程序完成所有GetPixel操作之后,请务必释放设备上下文,即使用ReleaseDC(NULL, dc);释放设备上下文,否则会导致内存泄漏问题。 详情请参阅此处
然而,对于这样的任务,建议您使用Auto-it。它易于使用,简单明了,而且非常直观(毕竟它专门设计用于执行此类操作)。
Local $color = PixelGetColor(200, 300)
MsgBox(0, "The color is ", $color )

0
基本步骤:如果游戏是全屏的,使用适当的OpenGL或Directx命令获取渲染屏幕的纹理。例如,使用glReadPixels可以从当前绑定的帧缓冲区中获取窗口相对像素坐标处的像素值。如果不是全屏,则必须将窗口位置与窗口相对像素坐标结合起来。
一些松散的例子:
glBindFramebuffer(GL_FRAMEBUFFER, yourScreenFramebuffer);
glReadPixels(/* your pixel X, your pixel Y, GLsizei width, 1 pixel wide, 1 pixel tall, GL_RGBA or GL_RGB, GL_UNSIGNED_BYTE, *where to store your pixel value */);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接