Graphics.CopyFromScreen有时会捕获透明窗口,有时则不会

时间:2012-04-27 16:16:00

标签: wpf winforms graphics screen-capture

我正在使用System.Drawing.Graphics.CopyFromScreen来获取桌面的部分屏幕截图。我注意到了一些好奇的行为。在某些机器上,当应用程序(WPF)窗口具有AllowTransparency =“True”时,调用CopyFromScreen将捕获窗口下的“什么”。但在其他机器上,它也捕获了调用窗口。

我在很多机器和操作系统上都尝试过,但没有找到模式。在XP和Windows 7笔记本电脑上,它在透明窗口下捕获。在我们拥有的一个Windows 7桌面上,它可以捕获窗口本身。 Aero或其他Windows 7显示功能似乎没什么区别。

可能是显卡问题吗?有没有办法在所有机器上获得一致的行为,或预测或检测何时会发生此问题?

编辑感谢Hans Passant提供的链接,以及一些进一步的测试,我现在明白这个问题仅与窗口透明度有关。在某些机器上,CopyFromScreen捕获所有窗口,在其他机器上它只捕获非透明窗口。

1 个答案:

答案 0 :(得分:4)

不太确定有时不行为。自Aero以来,分层窗户一直表现得很奇怪。可以肯定的是,除非使用指定CopyPixelOperation的重载,否则Graphics.CopyFromScreen()默认情况下不会捕获分层窗口。必需的选项是CaptureBlt,描述为:

  

窗口顶部分层的Windows包含在生成的图像中。默认情况下,图像仅包含您的窗口。

哪个不准确,如果它是一个分层窗口,则不会捕获“你的窗口”。更糟糕的是该方法存在错误。您不仅需要CaptureBlt,还需要SourceCopy。并且参数验证代码不允许该组合,当您尝试使用它时,您将获得InvalidEnumArgumentException。

嗯,GDI +是个臭虫。您将在this answer中找到解决此问题的丑陋pinvoke代码。