获取已知过程的图像数据

时间:2018-12-02 16:31:24

标签: c++ windows image

对于图像处理,我想从给定的过程中获取所有像素信息。 用于测试用于识别炉石卡的图像哈希算法的具体方法,因此我需要获取给定过程的屏幕截图。 如何在Windows中解决? 到目前为止,我的想法是:

  
      
  1. 获取进程名称。

  2.   
  3. 获取进程ID

  4.   
  5. 获取窗口句柄

  6.   

我不知道该如何走远。 我希望我能实现的目标是可以理解的。

1 个答案:

答案 0 :(得分:1)

不幸的是,没有通用的方法可以获取我所知道的特定窗口的像素。根据目标应用程序如何绘制自身,此任务可能非常简单或非常复杂。如果我们在谈论使用良好旧GDI的应用程序,那么您可以通过GetWindowDC()BitBlt / StretchBlt将自己的HDC放入窗口,并将其内容转换为位图自己的。

不幸的是,您的情况下的目标应用程序似乎是游戏。游戏通常使用Direct3D或OpenGL等3D图形API进行绘制。假设您不能简单地修改目标应用程序以随意将所需数据发送给您,那么我所知道的专门记录此类应用程序输出的唯一方法就是连接图形API并捕获来自API下方的数据。可以做到的。但是,实施这样的系统相当复杂。可能存在现有的库来帮助编写此类应用程序,但是我不知道在这里可以推荐的任何库。如果您不必实时捕获游戏内容,则可以使用屏幕录制应用程序来录制视频,然后将该视频用作算法的输入。您还可以使用诸如NSight GraphicsRenderDoc之类的图形调试工具。请注意,如今这些游戏,尤其是在线游戏,通常都具有作弊保护系统,如果您尝试加入游戏,可能会对您非常生气……

除了所有这些之外,一种替代方法可能是使用DXGI Output Duplication来捕获整个桌面。尽管您将无法针对一个特定的应用程序(据我所知),但这可能具有几个优点:首先,与完全基于API挂钩的方法相比,它的设置仅适度复杂。其次,无论目标应用程序使用什么API,即使该应用程序处于全屏模式,它都应该起作用。第三,由于您将直接从操作系统传递数据,因此作弊保护不会有任何问题。您可以使用MonitorFromWindow()获取出现在目标窗口上的监视器,然后enumerate的所有输出of all DXGI adapters找到与该HMONITOR对应的监视器。