拍摄没有屏幕冻结的屏幕截图。 C#和Windows XP

时间:2010-01-27 12:31:50

标签: c# windows performance

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

我的代码是:

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

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

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

2 个答案:

答案 0 :(得分:2)

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

yourBackgroundWorker.RunWorkerAsync()

修改 它可能正在这样做,所以在屏幕上移动的任何东西(如鼠标)都不会模糊屏幕截图。您可以尝试将屏幕分成较小的部分并截取屏幕截图,然后将它们拼接在一起。这会释放鼠标在每个部分屏幕截图之间的移动,因为你在一个单独的线程上,但它会冒着屏幕上发生变化的风险(取决于它实际需要多长时间)

答案 1 :(得分:1)

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

我认为没有别的方法,因为CopyFromScreen,调用BitBlt api函数,如果你想通过api调用来做这个就必须调用那个...这就是Windows唯一的东西提供。