【问题标题】:Graphics.CopyFromScreen sometimes captures transparent window, sometimes notGraphics.CopyFromScreen 有时会捕获透明窗口,有时不会
【发布时间】:2012-05-08 09:56:31
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: wpf winforms graphics screen-capture


    【解决方案1】:

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

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

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

    嗯,GDI+ 是一个包'o bug。您会在 this answer 中找到解决此问题所需的丑陋 pinvoke 代码。

    【讨论】:

    • 那个答案链接很有趣。就我而言,我不希望捕获半透明窗口。我仍然不明白为什么同一个应用程序在不同的系统上表现不同。
    • 我没有从这个问题中得到答案。解决方法是隐藏你的窗户并转动你的脚后跟几秒钟,以便所有未被覆盖的窗户都有机会自己涂漆。
    猜你喜欢
    • 2012-03-09
    • 2020-06-15
    • 1970-01-01
    • 2020-11-11
    • 2023-03-29
    • 2020-08-15
    • 1970-01-01
    • 2011-02-16
    • 2019-08-30
    相关资源
    最近更新 更多