我有这个名为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);
}
答案 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
。