首页 文章

C - 如何屏幕捕获,除了一些窗口

提问于
浏览
7

Situation :我有一个软件可以通过互联网进行屏幕共享,其中一个用户充当演示者,其他用户充当 Spectator /与会者 .

除了演示窗口之外,演示者还有一组出现在屏幕上的非共享窗口(用于开始共享/停止共享等的按钮栏,Skype窗口等) .

演示者可以通过屏幕共享软件的设置进行配置,使这些非共享窗口不可见(即它们不会出现在发送给与会者的屏幕共享中,但它们背后的窗口内容将显示在屏幕截图中) .

屏幕截图以大约每秒10帧或更快的速度发送 .

Question :除了这些NON-SHARING-WINDOWS窗口外,我怎样才能以编程方式捕获屏幕?

Notes

  • 由于每秒帧数较高,我无法最小化/最大化/设置这些窗口的alpha值,因为这样窗口就会闪烁 . 该应用程序是用Win32 C编写的 .

  • 我会使用分层窗口,但是由于Windows 7桌面组合功能,这不是开箱即用的(在Windows 8中,你不能再使用DwmEnableComposition暂时以编程方式禁用合成)

  • 我可以使用Windows XP / 2000/7等的分层窗口方法,以及Windows 8的不同方法(如果有的话),尽管我更喜欢在所有系统上运行的单个进程

  • 我还可以通过捕获单个图像(桌面,需要捕获的窗口)并使用他们的z-index创建最终图像来尝试"compose"截图,但由于所需的每秒帧数值,这个过程太慢了 .

3 回答

  • -1

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

    希望我给了一些灵感:-)如果有人知道如何只在没有子窗口的情况下复制桌面,请告诉我 .

  • 1

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

  • 0

    我认为限制大窗口内的捕获内容会更简单 . 否则你需要从屏幕截图中剪切一些窗口 .

相关问题