现状 :我有一个在互联网上进行屏幕共享,其中一个用户充当主持人,而其他用户作为观众/与会者软件。
除了展示窗口,主持人也有出现在屏幕上的一组非共享-WINDOWS的(对于开始共享/停止共享/等按钮栏,Skype的窗口等等)。
演示者可以从屏幕共享软件的安装配置,使这些非共享-WINDOWS隐形(即它们将不会出现在被发送给与会者的屏幕共享,但其背后的窗口内容将出现在屏幕截图)。
截图以大约10帧每秒,或更快发送。
问 :我如何通过编程捕捉屏幕,除了这些非共享-WINDOWS窗口?
注意事项 :
- 由于较高的帧每秒值,我不能最小化/最大化对这些窗口/组α,因为这样的话窗口闪烁。 该应用程序被写入的Win32 C ++。
- 我会用分层的窗口,但由于Windows 7的桌面组合功能的,出的现成,这是不可用(在Windows 8中,您不能使用DwmEnableComposition了暂时和编程方式禁用成分)
- 我可以使用分层窗口的方法适用于Windows XP / 2000/7等,并为Windows 8(如果有的话)不同的做法,但我宁愿一个单一的过程,在所有系统上的工作原理
- 我也可以尝试通过捕获单个图像(桌面,需要被捕获的窗口),并使用他们的z-index来创建最终图像“撰写”的截图,但由于所需的帧每秒的价值,这个过程将是太慢了。
在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 }
希望我给了一些启示:-)如果有人知道的方式如何仅桌面复制没有它的子窗口,请让我知道。
您可以使用放大镜API。
有一个在放大镜API的功能,使您可以排除你的目标窗口特定窗口(含1倍放大,其中放大镜呈现您的窗口)。
您可以在该窗口设置为全屏,使之透明,然后在使用PrintWindow功能。
功能: https://docs.microsoft.com/en-us/windows/desktop/api/magnification/nf-magnification-magsetwindowfilterlist
示例项目:
https://www.codeproject.com/Articles/607288/Screenshot-using-the-Magnification-library
https://code.msdn.microsoft.com/windowsdesktop/Magnification-API-Sample-14269fd2
I think that to limit the capture content within a big window will be more simple. otherwise you will need to cut some windows from the screen capture.