情况:我有一个通过 Internet 执行屏幕共享的软件,其中一个用户充当演示者,其他用户充当观众/与会者。
除了演示窗口之外,演示者还会在屏幕上显示一组非共享窗口(用于开始共享/停止共享等的按钮栏、Skype 窗口等)。
演示者可以通过屏幕共享软件的设置进行配置,使这些非共享窗口不可见(即它们不会出现在发送给与会者的屏幕共享中,但它们后面的窗口内容将出现在屏幕截图中)。
屏幕截图以大约每秒 10 帧或更快的速度发送。
Question:除了这些非共享窗口窗口之外,如何以编程方式捕获屏幕?
Notes:
- 由于每秒帧数较高,我无法最小化/最大化/设置这些窗口的 Alpha,因为这样窗口就会闪烁。该应用程序是用 Win32 C++ 编写的。
- 我会使用分层窗口,但由于 Windows 7 桌面合成功能,这无法开箱即用(并且在 Windows 8 中,您不能再使用 DwmEnableComposition 来临时以编程方式禁用合成)
- 我可以对 Windows XP/2000/7 等使用分层窗口方法,对 Windows 8 使用不同的方法(如果有的话),但我更喜欢在所有系统上运行的单个进程
- 我还可以尝试通过捕获单个图像(桌面、需要捕获的窗口)并使用它们的 z 索引来创建最终图像来“合成”屏幕截图,但由于所需的每秒帧数值,这个过程会太慢。
在 Windows 中,甚至桌面也被视为窗口并具有自己的 HWND。
然而,仅复制“壁纸”本身似乎并不容易。
所以我基本上看到有两种方法可以做到这一点。
1. 复制整个桌面,例如BitBlt(GetWindowDC(GetDesktopWindow()),...)
OR
-
Use GetWindow
并从桌面窗口开始向后遍历窗口列表,您可以使用 GetDesktopWindow() 确定其 HWND,如下所示:
// 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
}
希望我能给一些启发:-)
如果有人知道如何仅复制桌面而不复制其子窗口,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)