2010-07-18 22 views
0

我正在将一个窗口(属于另一个进程)移到前面以截取它的屏幕截图。我可以使用SetForegroundWindow来完成此操作,但是该函数会立即返回。另一个过程需要花费不同的时间来重绘其主窗口(这要求它访问数据库),所以我不能确定当我截取屏幕截图时窗口已完全呈现。有时我在屏幕截图中获得的只是目标窗口的轮廓,在前面的任何窗口之上。等待另一个Windows进程重新绘制其主窗口的可靠方法

是否有可靠的方法来等待另一个进程的窗口被完全绘制?我怀疑没有,但它值得一试。也许有一条消息,我可以发送到窗口,会有这种效果?

注意:实现语言并不重要,但我需要一个使用本机Windows API的解决方案,无论是直接从C/C++代码还是通过P/Invoke(例如从C#或VB.NET)。不幸的是我不能使用任何WinForms函数。

回答

0

我使用以下策略得到了良好的效果:

  1. 呼叫PrintWindow到目标窗口渲染成位图和丢弃的结果。
  2. 呼叫SetForegroundWindow带来的目标窗口前(这也触发重绘,但重绘通常是快,因为同步WM_PRINTCLIENT已经迫使过程页面渲染所需的数据。)
  3. 睡眠的很短的时间(10毫秒)
  4. 以使用BitBlt
  5. 截图还原目标窗口
1

UpdateWindow将重新绘制窗口,如果它的任何部分需要重绘,然后返回。

+0

原Z-为了我仍然有同样的问题。在完成绘画之前,'UpdateWindow'返回得太快。 – finnw 2010-07-18 17:15:17

+0

@finnw:我想'UpdateWindow'后,我会调用'WaitForInputIdle',看看这是否有诀窍。我之前没有在这种情况下使用'WaitForInputIdle',所以我不能保证它会有效,但我猜想至少有一个相当不错的机会... – 2010-07-18 17:17:35

+1

@Jerry Coffin IIRC WaitForInputIdle只适用于进程正在启动。 – Anders 2010-07-18 17:34:14

相关问题