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

C – 如何屏幕捕获,除了一些窗口,第1张

概述情况:我有一个通过Internet执行屏幕共享的软件,其中一个用户充当演示者,其他用户充当观众/与会者. 除了演示窗口之外,演示者还有一组出现在屏幕上的非共享窗口(用于开始共享/停止共享等的按钮栏,Skype窗口等). 演示者可以通过屏幕共享软件的设置进行配置,使这些非共享窗口不可见(即它们不会出现在发送给与会者的屏幕共享中,但它们背后的窗口内容将显示在屏幕截图中). 屏幕截图以大约每秒10帧或更 情况:我有一个通过Internet执行屏幕共享的软件,其中一个用户充当演示者,其他用户充当观众/与会者.

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

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

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

问题:除了这些NON-SHARING-windows窗口外,我如何以编程方式捕获屏幕?

笔记:

>由于每秒帧数较高,我无法最小化/最大化/设置这些窗口的Alpha,因为这样窗口就会闪烁.该应用程序是用Win32 C编写的.
>我会使用分层窗口,但由于Windows 7桌面组合功能,这不是开箱即用的(在windows 8中,您不能再使用DWmEnableComposition暂时以编程方式禁用合成)
>我可以使用windows XP / 2000/7等的分层窗口方法,以及windows 8的不同方法(如果有的话),但我更喜欢在所有系统上运行的单个进程
>我还可以尝试通过捕获单个图像(桌面,需要捕获的窗口)和使用z-index创建最终图像来“组合”屏幕截图,但由于所需的每秒帧数价值,这个过程太慢了.

解决方法 在windows中,即使桌面被视为一个窗口,也有自己的HWND.
然而,似乎不容易仅仅自己复制“壁纸”.

所以我基本上看到了两种方法.
1.复制整个桌面,例如的BitBlt(Ge@R_419_5790@owDC(GetDesktopWindow()),…)

要么

>使用Ge@R_419_5790@ow并从桌面窗口向后遍历窗口列表,桌面窗口的HWND可以通过GetDesktopWindow()确定,如下所示:

//在黑色DC上画画
HWND = GetDesktopWindow()
while(hwnd = Ge@R_419_5790@ow(hwnd,GW_HWNDPREV))
{
//这个窗口不共享吗?继续
//把它咬到我们的直流电源上
}

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

总结

以上是内存溢出为你收集整理的C – 如何屏幕捕获,除了一些窗口全部内容,希望文章能够帮你解决C – 如何屏幕捕获,除了一些窗口所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239446.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存