【问题标题】:Reading VRAM data读取显存数据
【发布时间】:2011-11-23 21:19:35
【问题描述】:

我正在尝试制作一个 C++ 程序来捕获屏幕上显示的所有内容。

经过大量谷歌搜索后,我发现捕获特定窗口的方法, 或特定的程序屏幕,或某些程序的特定缓冲区。 不知何故,我得到了一些可以捕获屏幕的代码,但它们没有显示鼠标或视频。

然后我开始知道,无论显示什么,捕获所有内容的唯一方法是访问显卡上的视频 RAM(我的是集成显卡)。 但是我找不到任何方法来读取 VRAM 数据。

我知道 VRAM 保存进入显示器的每个像素。这就是我希望我的程序能够快速读取和读取它以获得大约 30fps 的内容。 我需要在转换为模拟之前存储在 VRAM 中的原始位图。

编辑:-我刚刚找到了这个 sdl 和像素烤面包机库......他们可以读取所谓的帧缓冲区......这是否有用 opengl 有一个名为 getPixels() 的方法可以读取缓冲区数据所有应用程序,无论正在运行什么??

【问题讨论】:

  • 显存受操作系统保护。您首先需要告诉我们这将在哪个操作系统上运行。
  • 带有“我知道...”的问题通常是错误的。
  • 最好的解决方案是在没有鼠标的情况下捕获屏幕,然后获取鼠标坐标并出于任何目的自行绘制。
  • 如果你想捕捉视频,你考虑过 RIAA 吗?他们一定会对您的活动感兴趣。
  • @jli jli 是对的,afaik 所有的 VNC 实现都是这样做的。顺便说一句,您可以查看一些 OSS VNC 实现,例如 TightVnc,看看它们是如何做到的。需要注意的是,您仍然会询问操作系统,它可以绘制您无法捕捉到的内容,例如管理员权限对话。

标签: c++ graphics


【解决方案1】:

使用硬件覆盖,实际上可能没有包含屏幕图像和鼠标光标的图像。

在没有鼠标光标的情况下捕获屏幕的代码正在读取 VRAM。

【讨论】:

  • 这真的是问题的答案吗?看起来更像是一条评论。
【解决方案2】:

您很可能必须为 Windows 开发内核模式驱动程序,因为它只能从操作系统内核直接访问所有内容。虽然这不是一件容易的事,如果你尝试签署你的驱动程序,微软很可能会拒绝。或者如果他们签名,他们可能很快就会撤销签名。简而言之,由于相关的法律问题,您在分发驱动程序时会遇到问题。

另一种选择是找到一个开源 PC 模拟器,可以在其中运行 Windows 并播放有问题的视频,然后破解它以访问 VM 的内存。相同的法律内容。

除此之外,我认为没有保证可以获取所有数据的方法(当然,除了侵入硬件或简单地在相机上捕获屏幕)。

【讨论】:

  • 这是错误的。显存是通过现有的 API 访问的——DirectX 和 OpenGL 是其中两个更好的(GDI 可以做到,但不能像 OP 要求的那样以接近 30fps 的速度)。
  • @freefallr:这没有错。想想禁止您使用常规 API 复制敏感屏幕数据的功能。那怎么样?
  • “很可能您必须为 Windows 开发内核模式驱动程序,因为它只能从操作系统内核直接访问所有内容”——我认为这是错误的。您可以通过上述 API 直接访问 VRAM。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 2020-09-20
相关资源
最近更新 更多