C# print screen active window

10,400

The simplest way will be to switch the code:

// Set the bitmap object to the size of the screen
bmpScreenshot = new Bitmap(this.Bounds.Width, this.Bounds.Height,
                           PixelFormat.Format32bppArgb);
// Create a graphics object from the bitmap
gfxScreenshot = Graphics.FromImage(bmpScreenshot);
// Take the screenshot from the upper left corner to the right bottom corner
gfxScreenshot.CopyFromScreen(this.Bounds.X, this.Bounds.Y, 0, 0,
                             this.Bounds.Size, CopyPixelOperation.SourceCopy);

SaveFileDialog saveImageDialog = new SaveFileDialog();
saveImageDialog.Title = "Select output file:";
saveImageDialog.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif";
//saveImageDialog.FileName = printFileName;
if (saveImageDialog.ShowDialog() == DialogResult.OK)
{
    // Save the screenshot to the specified path that the user has chosen
    bmpScreenshot.Save(saveImageDialog.FileName, ImageFormat.Png);
}

First create the screenshot and than show the save dialog and save it to the disc if the dialog was closed with OK.

The problem is, that in your code, the program has no time to repaint your form. If you want to retain the structure of your code, you would need to give it some time to process the pending events, possibly by calling Application.DoEvents.

Share:
10,400
cnewbie
Author by

cnewbie

Updated on June 04, 2022

Comments

  • cnewbie
    cnewbie almost 2 years

    I am currently trying to print screen an active window using Visual C#. I have this code:

    SaveFileDialog saveImageDialog = new SaveFileDialog();
    saveImageDialog.Title = "Select output file:";
    saveImageDialog.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif";
    //saveImageDialog.FileName = printFileName;
    if (saveImageDialog.ShowDialog() == DialogResult.OK)
    {
        // Set the bitmap object to the size of the screen
        bmpScreenshot = new Bitmap(this.Bounds.Width, this.Bounds.Height, PixelFormat.Format32bppArgb);
        // Create a graphics object from the bitmap
        gfxScreenshot = Graphics.FromImage(bmpScreenshot);
        // Take the screenshot from the upper left corner to the right bottom corner
        gfxScreenshot.CopyFromScreen(this.Bounds.X, this.Bounds.Y, 0, 0, this.Bounds.Size, CopyPixelOperation.SourceCopy);
        // Save the screenshot to the specified path that the user has chosen
        bmpScreenshot.Save(saveImageDialog.FileName, ImageFormat.Png);
    }
    

    But this code captures the SaveImageDialog as well. Any cure to this problem? Thanks a lot.