如何在Windows游戏上叠加图形?

12

我希望我的程序能够启动任何Windows游戏,并在用户玩游戏时,间歇性地在游戏窗口的某个部分显示一些文本或图片。游戏可能是窗口化或全屏模式。根据我从在线资源中了解到的情况,这可以通过使用支持覆盖并使用Windows Hooks来跟踪目标应用程序窗口的图形库来完成。在这种情况下,我有一些问题。

  1. 覆盖会影响游戏的性能吗?
  2. 挂钩应用程序会如何影响性能?
  3. 还有其他方法可以实现此目的吗?例如,您认为DirectX调试和分析工具PIX是如何工作的?
1个回答

15

Fraps 是第三方应用程序对全屏 DirectX 应用程序进行此类操作的典型例子。它通过挂钩某些系统调用并将自身插入在应用程序和 DirectX 之间的调用链中来工作。虽然会有一定的性能损失,但总的来说非常小。

这个页面似乎提供了一些关于如何以这种方式钩取应用程序的详细信息和示例代码。

如果我没记错的话,在其他论坛讨论中(现在找不到链接了,请搜索类似“Fraps 如何工作”的问题,这是一个普遍的问题),Fraps 挂钩了一些内容以强制应用程序加载其 DLL,然后挂钩 Present() 调用并执行 device->Clear() 调用,然后再调用真正的 Present(),其中包括一些小矩形的列表,用不同的颜色设置为显示帧率数字。这对性能的影响很小,并且与应用程序正在进行的任何渲染广泛兼容。覆盖位图将更加复杂,因为不能像在 Present 时间那样轻松完成。也许如果您可以挂钩 EndScene,那么您可以做更多的事情,但是您必须小心不要改变设备状态。

PIX 具有 DirectX 驱动程序的特权访问权限,因此我不希望将其用作模拟的模型。

如果目标应用程序以窗口模式运行,则仍然可以钩取 DirectX,但您也可以使用 GDI。

编辑: 我认为这个链接是我最初想到的链接。


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