如何屏幕捕捉,除了一些窗口

情况 :我有一个通过互联网进行屏幕共享的软件,其中一个用户充当演讲者,其他用户充当观众/参与者。

除演示窗外,演讲者还有一组屏幕上出现的非共享窗口(用于开始共享/停止共享等的button栏,Skype窗口等)。

演示者可以从屏幕共享软件的设置中进行configuration,使这些非共享窗口不可见(即,它们不会出现在正在发送给与会者的屏幕共享中,但它们后面的窗口内容将显示在屏幕截图中)。

屏幕截图以大约每秒10帧或更快的速度发送。

问题 :如何以编程方式捕获屏幕,除了这些非共享-Windows窗口?

备注

  • 由于较高的帧每秒值,我不能最小化/最大化/设置这些窗口的alpha,因为那么窗口将闪烁。 该应用程序是用Win32 C ++编写的。
  • 我会使用分层的窗口,但由于Windows 7桌面组合function,这是不可用的现成的(在Windows 8中,您不能使用DwmEnableComposition暂时和编程方式禁用组成)
  • 我可以对Windows XP / 2000/7等使用分层窗口方法,对Windows 8使用不同的方法(如果有的话),尽pipe我更喜欢一个适用于所有系统的单个进程
  • 我还可以尝试通过捕获单个图像(桌面,需要捕获的窗口)和使用它们的z-index来创build最终图像来“撰写”屏幕截图,但是由于所需的每秒帧数,这个过程会太慢。

在Windows甚至桌面被认为是一个窗口,并有自己的HWND。 但是,似乎不可能仅仅复制“墙纸”。

所以我基本上看到两种方式来做到这一点。 1.复制整个桌面,例如BitBlt(GetWindowDC(GetDesktopWindow()),…)

要么

  1. 使用GetWindow并从桌面窗口开始向后遍历窗口列表,这些桌面窗口的HWND可以通过GetDesktopWindow()来确定,如下所示:

    // paint on a black DC hwnd=GetDesktopWindow() while (hwnd = GetWindow(hwnd, GW_HWNDPREV)) { // is this window not shared? continue // else bitblt it into our dc }

希望我给了一些灵感:-)如果有人知道如何复制只有桌面没有其子窗口,请让我知道。

我认为限制在一个大窗口内的捕获内容将会更简单。 否则你将需要从屏幕截图中删除一些窗口。