如何正确地将PrimaryScreen更改为AllScreens?

时间:2016-11-08 14:12:40

标签: c# .net screenshot gdi+

我有这个名为Print()的方法,当我调用它时,它会从主屏幕上的所有像素创建一个位图,从一个点到另一个点。

但是,它只适用于主屏幕(是的我知道我将其设置为Screen.PrimaryScreen而不是Screen.AllScreens)。

我试过这样做,但我必须创建一个包含所有屏幕的数组,这就是我遇到的问题。我如何实现与此方法完全相同的功能,但是对于多个屏幕?

private void Print()
{
    string path;
    path = "%AppData%\\Image.png";
    path = Environment.ExpandEnvironmentVariables(path);

    Bitmap bt;
    Graphics screenShot;

    bt = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
    screenShot = Graphics.FromImage(bt);
    screenShot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
    bt.Save(path);
}

3 个答案:

答案 0 :(得分:2)

您可以使用Rectangle.Union方法和LINQ:

组合屏幕的边界
var bounds = Screen.AllScreens.Select(s => s.Bounds).Aggregate(Rectangle.Union);

然后,只需在代码中将Screen.PrimaryScreen.Bounds替换为bounds变量。

答案 1 :(得分:1)

使用Screens.AllScreens()方法返回所有屏幕的数组,然后循环显示:

foreach (var screen in Screens.AllScreens())
{
    bt = new Bitmap(screen.Bounds.Width, screen.Bounds.Height, PixelFormat.Format32bppArgb);
    ....
}

这将采用每个屏幕的单独位图图像。如果您想为所有屏幕使用单个位图,那么您需要将这些位图拼接在一起或使用Ivan's approach来获取所有屏幕的组合边界。

答案 2 :(得分:0)

你说你要从一个点到另一个点,所以要获得包含点的屏幕,你可以使用Screen.FromPoint方法。

Screen screen = Screen.FromPoint(point);

然后,无论您在何处使用Screen.PrimaryScreen,只需使用screen