C ++ - 如何截屏,除了一些窗户(C++ - How to screen-capture, e

2019-07-29 06:19发布

现状 :我有一个在互联网上进行屏幕共享,其中一个用户充当主持人,而其他用户作为观众/与会者软件。

除了展示窗口,主持人也有出现在屏幕上的一组非共享-WINDOWS的(对于开始共享/停止共享/等按钮栏,Skype的窗口等等)。

演示者可以从屏幕共享软件的安装配置,使这些非共享-WINDOWS隐形(即它们将不会出现在被发送给与会者的屏幕共享,但其背后的窗口内容将出现在屏幕截图)。

截图以大约10帧每秒,或更快发送。

:我如何通过编程捕捉屏幕,除了这些非共享-WINDOWS窗口?

注意事项

  • 由于较高的帧每秒值,我不能最小化/最大化对这些窗口/组α,因为这样的话窗口闪烁。 该应用程序被写入的Win32 C ++。
  • 我会用分层的窗口,但由于Windows 7的桌面组合功能的,出的现成,这是不可用(在Windows 8中,您不能使用DwmEnableComposition了暂时和编程方式禁用成分)
  • 我可以使用分层窗口的方法适用于Windows XP / 2000/7等,并为Windows 8(如果有的话)不同的做法,但我宁愿一个单一的过程,在所有系统上的工作原理
  • 我也可以尝试通过捕获单个图像(桌面,需要被捕获的窗口),并使用他们的z-index来创建最终图像“撰写”的截图,但由于所需的帧每秒的价值,这个过程将是太慢了。

Answer 1:

在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 }

希望我给了一些启示:-)如果有人知道的方式如何仅桌面复制没有它的子窗口,请让我知道。



Answer 2:

您可以使用放大镜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



Answer 3:

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.



文章来源: C++ - How to screen-capture, except for some windows