背景: 我有一款软件可以在互联网上进行屏幕共享,其中一个用户充当演示者,其他用户则是观众/参与者。
除了演示窗口外,演示者还有一组不共享的窗口显示在屏幕上(启动共享/停止共享等按钮栏、Skype 窗口等)。
演示者可以从屏幕共享软件的设置中配置,使这些不共享的窗口变为不可见状态(即它们不会出现在发送给参与者的屏幕共享中,但它们后面的窗口内容将出现在截屏中)。
截屏的帧速率约为每秒 10 帧或更快。
问题: 如何以编程方式捕获屏幕,但排除这些不共享窗口?
备注:
- 由于帧速率较高,我无法对这些窗口进行最小化/最大化/透明化等操作,因为这样窗口会闪烁。该应用程序是使用 Win32 C++ 编写的。
- 我可以使用分层窗口,但由于 Windows 7 桌面组合功能,这不能直接使用(在 Windows 8 中,你不能再使用 DwmEnableComposition 临时和以编程方式禁用组合)
- 我可以为 Windows XP/2000/7 等使用分层窗口方法,而对于 Windows 8,则采用不同的方法(如果有),但我更喜欢一个适用于所有系统的单个进程。
- 我也可以尝试通过捕获单个图像(桌面、需要捕获的窗口)并利用它们的 z-索引来创建最终图像来“组合”截屏,但由于所需的帧速率值,这个过程太慢了。
ScreenCapture
的类,在这个类中,您可以设置屏幕坐标以捕获所有屏幕中您想要捕获的部分。所有屏幕都被视为一个大图像,您只需要设置您希望开始和结束的坐标即可。 - D.Zadravec