【问题标题】:Taking a screenshot without screen freeze. C# and WindowsXP在不冻结屏幕的情况下截取屏幕截图。 C# 和 Windows XP
【发布时间】:2010-01-27 12:31:49
【问题描述】:

我正在使用 C# .NET 截取第二台显示器的内容并将其显示在主屏幕的窗口中。

我的代码是:

screenShotGraphics.CopyFromScreen(
    Screen.AllScreens[screen].Bounds.X,
    Screen.AllScreens[screen].Bounds.Y,
    0,
    0,
    Screen.AllScreens[screen].Bounds.Size,
    CopyPixelOperation.SourceCopy);

当它被按钮点击触发时效果很好,因为轻微的延迟并不明显,但是当它自动运行时(比如每隔几秒),用户可以很容易地注意到他们的鼠标“锁定”了一段时间秒。

显然这并不理想。那么有没有更快的方法来执行这个操作呢? (或者在不中断鼠标移动或交互的情况下执行它的方法?

【问题讨论】:

  • 您在截屏的同时还做其他事情吗?例如,如果您调整图像大小然后复制它,您可以将任务拆分并在中间延迟执行它们。那么延迟可能不会那么明显。
  • 底层 Windows API 调用 (BitBlt) 在复制位图时会暂时隐藏鼠标。你无法解决这个问题。

标签: c# windows performance


【解决方案1】:

您可以尝试使用BackgroundWorker 控件执行屏幕截图,这是在单独线程上运行该函数的一种简单方法。只需在 BackgroundWorker 的 DoWork 事件中调用您的屏幕截图函数,只要您想运行您的函数,只需调用:

yourBackgroundWorker.RunWorkerAsync()

编辑: 它可能正在这样做,因此屏幕上的任何移动(如鼠标)都不会模糊屏幕截图。您可以尝试将屏幕分成更小的部分并截取屏幕截图,然后将它们拼接在一起。由于您在单独的线程上,因此这将释放鼠标在每个部分屏幕截图之间的移动,但它会冒着屏幕上发生变化的风险(取决于实际花费的时间)

【讨论】:

  • 我已经在单独的线程中运行了截图。但这无济于事 - 以这种方式截取屏幕截图的操作,即使在单独的线程中,似乎也会丢失导致光标短暂冻结。
  • 对您的回答稍作修改后,我发现它很好地解决了问题。干杯!
  • 只是出于好奇,你把它分成了多少部分,截图需要多长时间才能完成?
  • @ElliotHughes 你做了什么?你能分享你的解决方案吗?谢谢!
  • @Peretz 恐怕在过去的几年里我已经丢失了代码。我记得根据 Smoore 的回答工作给了我一个非常充分的解决方案。
【解决方案2】:

尝试在主线程上进行调用,如果您需要将图像保存到文件中,请在另一个线程中进行...

我认为没有其他方法,因为 CopyFromScreen 调用 BitBlt api 函数,如果你想通过 api 调用来做到这一点,你必须调用女巫......所以这是 Windows 唯一的事情提供。

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多