情况 :我有一个通过互联网进行屏幕共享的软件,其中一个用户充当演讲者,其他用户充当观众/参与者。
除演示窗外,演讲者还有一组屏幕上出现的非共享窗口(用于开始共享/停止共享等的button栏,Skype窗口等)。
演示者可以从屏幕共享软件的设置中进行configuration,使这些非共享窗口不可见(即,它们不会出现在正在发送给与会者的屏幕共享中,但它们后面的窗口内容将显示在屏幕截图中)。
屏幕截图以大约每秒10帧或更快的速度发送。
问题 :如何以编程方式捕获屏幕,除了这些非共享-Windows窗口?
备注 :
在Windows甚至桌面被认为是一个窗口,并有自己的HWND。 但是,似乎不可能仅仅复制“墙纸”。
所以我基本上看到两种方式来做到这一点。 1.复制整个桌面,例如BitBlt(GetWindowDC(GetDesktopWindow()),…)
要么
使用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 }
希望我给了一些灵感:-)如果有人知道如何复制只有桌面没有其子窗口,请让我知道。
我认为限制在一个大窗口内的捕获内容将会更简单。 否则你将需要从屏幕截图中删除一些窗口。