这个问题可能有点拗口。我想访问用户启动具有某些UI的任何Windows应用程序,并在游戏引擎中重新渲染这些窗口(每个窗口都有自己的纹理)。本质上,我试图将在我的机器上运行的每个应用程序转换为3D世界(在他们自己的纹理上)。
我正在使用Unity并找到一种解决方法来使用WIN32 API获取此行为,但它带有一个重要的警告:
- 我使用EnumWindows()来获取Windows列表 - 遗憾的是很多没有UI的Windows会被迭代
- 对于每个Window,调用包含Window坐标(使用GetWindowRect())的脚本
- 然后每个脚本调用GetForegroundWindow()以确定是否正在使用该用户操作此Window。如果是这样,它通过调用Graphics CopyFromScreen()并使用从GetWindowRect()返回的位置来访问帧缓冲区
醇>
基本上,当用户与Window交互时,我会复制窗口所在的部分屏幕,当用户不与应用程序窗口交互时,他基本上都有截图。
问题是:
- EnumWindows()返回没有用户界面的窗口(编辑:解决方案here非常棒并修复此问题)
- 如果窗口刷新其内容(如视频播放),我将无法及时刷新
- 我必须一遍又一遍地调用EnumWindows()以确定是否已创建新窗口
- 如果窗口的一部分位于屏幕之外,它也会中断
- 如果两个窗口相互重叠,则会中断
是否有更好的方法来访问Windows上每个应用的呈现,或者部分屏幕捕获是我的最佳解决方案吗?