情况:我有一个通过互联网执行屏幕共享的软件,其中一个用户充当演示者,其他用户充当观众/与会者。
除了演示窗口外,演示者还有一组出现在屏幕上的非共享窗口(用于开始共享/停止共享等的按钮栏,Skype窗口等)。
演示者可以通过屏幕共享软件的设置进行配置,使这些非共享窗口不可见(即它们不会出现在发送给与会者的屏幕共享中,但它们背后的窗口内容会出现在屏幕截图中。
屏幕截图以大约每秒10帧或更快的速度发送。
问题:如何以编程方式捕获屏幕,除了这些非共享窗口窗口?
备注:
答案 0 :(得分:1)
在Windows中,即使桌面被视为一个窗口,也有自己的HWND。 然而,似乎不容易只复制"壁纸"独自一人。
所以我基本上看到了两种方法。 1.复制整个桌面,例如的BitBlt(GetWindowDC(GetDesktopWindow()),...)
OR
使用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
}
希望我给了一些灵感:-) 如果有人知道如何在没有子窗口的情况下复制桌面,请告诉我。
答案 1 :(得分:0)
您可以使用放大镜API。
放大镜API中有一个功能,可让您从目标窗口(显示放大镜的窗口放大1倍)中排除特定窗口。
您可以将此窗口设置为全屏并使其透明,然后使用PrintWindow功能。
示例项目:
https://www.codeproject.com/Articles/607288/Screenshot-using-the-Magnification-library
https://code.msdn.microsoft.com/windowsdesktop/Magnification-API-Sample-14269fd2
答案 2 :(得分:-1)
我认为限制大窗口内的捕获内容会更简单。否则你需要从屏幕截图中剪切一些窗口。