【问题标题】:Read pixel on game (OpenGL or DirectX) screen读取游戏(OpenGL 或 DirectX)屏幕上的像素
【发布时间】:2012-06-22 15:12:03
【问题描述】:

我想通过第三方应用程序(这不是我的游戏)读取游戏(例如 OpenGL 或 DirectX)中给定位置的像素颜色。

我尝试在 C# 中使用它,该代码非常适合读取桌面、窗口等的颜色,但是当我启动游戏时,我只得到 #000000,一个黑色像素。我认为这是因为我没有在正确的“位置”或类似的地方阅读。

有人知道怎么做吗?我提到了 C#,但 C/C++ 也可以。

【问题讨论】:

  • 您现在如何阅读颜色/您使用什么方法?因为我在使用 Windows 的放大镜辅助工具时遇到了类似的问题,桌面和其他窗口可以正确显示,但是任何绕过 Windows API 并直接绘制到屏幕上的东西(即大多数游戏)都会显示为空白/黑色。或者更确切地说,任何直接绘制到叠加层的东西,如果这是正确的术语的话。
  • 哦,我们开始;我没有解决方案,但我很确定我找到了你的问题。 en.wikipedia.org/wiki/Hardware_overlay “由于使用了硬件覆盖,屏幕截图程序(例如,当用户按下 PrtSc 键时自动内置到 Windows 中的程序)通常不会捕获出现在硬件覆盖窗口中的内容。相反,捕获仅包含特殊蒙版颜色的空白区域。”所以你可能需要研究 DirectX 和 OpenGL,看看它们有哪些可用的方法。

标签: opengl colors directx screen


【解决方案1】:

在基本步骤中:如果游戏是全屏的,则使用适当的 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 */);

【讨论】:

    【解决方案2】:

    在 Windows 上有 GDI(图形设备接口):使用 GDI,您可以使用 HDC dc = GetDC(NULL); 轻松获取设备上下文,然后使用 COLORREF color = GetPixel(dc, x, y); 读取像素值。但请注意:您必须在之后(当程序的所有 GetPixel 操作完成时)使用ReleaseDC(NULL, dc); 释放设备上下文 - 否则您会泄漏内存。 另请参阅here 了解更多详情。

    但是,对于这样的任务,我建议您使用:Auto-it。 它简单易用且非常简单明了(毕竟它就是为此类操作而设计的)。

    Local $color = PixelGetColor(200, 300)
    MsgBox(0, "The color is ", $color )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 2016-07-23
      • 2023-04-11
      相关资源
      最近更新 更多