13
votes

Hi I am working on a program where the user can take screenshots. The users can choose whether they want to take a screenshot from screen 1,2,3 or 4. I know how to get out the first screenshot from the first screen, but how do I get the images from screen 2,3 and 4?

My code to get the screenshot from the first screen looks like this:

 private void btnScreenOne_Click(object sender, EventArgs e) 
 {
     Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
         Screen.PrimaryScreen.Bounds.Height);

     Graphics graphics = Graphics.FromImage(bitmap as Image);

     graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size);

     bitmap.Save(@"C:\Users\kraqr\Documents\PrintScreens\" + 
        DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + " Screen1" + 
        ".bmp", ImageFormat.Bmp);

}

Grateful for answers.

3

3 Answers

14
votes

Use Screen.AllScreens instead:

foreach ( Screen screen in Screen.AllScreens )
{
    screenshot = new Bitmap( screen.Bounds.Width,
        screen.Bounds.Height,
        System.Drawing.Imaging.PixelFormat.Format32bppArgb );
    // Create a graphics object from the bitmap
    gfxScreenshot = Graphics.FromImage( screenshot );
    // Take the screenshot from the upper left corner to the right bottom corner
    gfxScreenshot.CopyFromScreen(
        screen.Bounds.X,
        screen.Bounds.Y, 
        0, 
        0,
        screen.Bounds.Size,
        CopyPixelOperation.SourceCopy );
    // Save the screenshot
}
9
votes

The Screen class has a static property AllScreens which gives you an array of screens. Those objects have a Bounds property which you can surely use ...

Long story short: You initialize the bitmap with the size of the desired screen (don't use PrimaryScreen, because that's only the primary one, as the name implies) and then pass the appropriate boundaries to CopyFromScreen.

6
votes

Use Screen.AllScreens to retrieve the coordinates through the Bounds property of the specific screen and pass them to CopyFromScreen.