访问Windows中的应用程序窗口

时间:2015-04-30 02:10:35

标签: windows winapi casting

这个问题可能有点拗口。我想访问用户启动具有某些UI的任何Windows应用程序,并在游戏引擎中重新渲染这些窗口(每个窗口都有自己的纹理)。本质上,我试图将在我的机器上运行的每个应用程序转换为3D世界(在他们自己的纹理上)。

我正在使用Unity并找到一种解决方法来使用WIN32 API获取此行为,但它带有一个重要的警告:

  1. 我使用EnumWindows()来获取Windows列表 - 遗憾的是很多没有UI的Windows会被迭代
  2. 对于每个Window,调用包含Window坐标(使用GetWindowRect())的脚本
  3. 然后每个脚本调用GetForegroundWindow()以确定是否正在使用该用户操作此Window。如果是这样,它通过调用Graphics CopyFromScreen()并使用从GetWindowRect()返回的位置来访问帧缓冲区
  4. 基本上,当用户与Window交互时,我会复制窗口所在的部分屏幕,当用户不与应用程序窗口交互时,他基本上都有截图。

    问题是:

    • EnumWindows()返回没有用户界面的窗口(编辑:解决方案here非常棒并修复此问题)
    • 如果窗口刷新其内容(如视频播放),我将无法及时刷新
    • 我必须一遍又一遍地调用EnumWindows()以确定是否已创建新窗口
    • 如果窗口的一部分位于屏幕之外,它也会中断
    • 如果两个窗口相互重叠,则会中断

    是否有更好的方法来访问Windows上每个应用的呈现,或者部分屏幕捕获是我的最佳解决方案吗?

0 个答案:

没有答案