【C#】自分自身のフォームのスクリーンショットをプリンタへ直接印刷する

自分自身のフォームのスクリーンショットをプリンタへ直接印刷

今回使用した環境

インターネット接続可能のオンラインの環境

64 ビット オペレーティング システム

Windows 10 21H1

Visual Studio 2022 C# .NET Framework 4.8

フォームデザイン

フォームは以下のようなイメージで、真ん中にボタン画面印刷ボタンがひとつあるだけです。

ソースコード

using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;

namespace ScreenPrinting
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // ビットマップイメージ
        private Bitmap _bitmapImage;

        private void button1_Click(object sender, EventArgs e)
        {
            // 自フォームのサイズを取得
            Size size = this.Size;

            // ビットマップイメージのサイズを決定
            _bitmapImage = new Bitmap(size.Width, size.Height);

            // 自フォームの画面コピーをビットマップイメージへ描画
            using (Graphics g = Graphics.FromImage(_bitmapImage))
            {
                g.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, size);
            }

            // PrintDocumentクラス
            PrintDocument printDocument = new PrintDocument();

            // この設定をすることで「印刷中」のウィンドウを非表示とする
            printDocument.PrintController = new StandardPrintController();

            // PrintPageイベントでprintDocumentインスタンスに描画して印刷する
            printDocument.PrintPage += new PrintPageEventHandler(printDocument_PrintPage);
            printDocument.Print();
        }

        private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
        {
            // printDocumentインスタンスにビットマップイメージを描画
            e.Graphics.DrawImage(_bitmapImage, 0, 0);
        }
    }
}

※36行目の「printDocument.PrintController = new StandardPrintController();」がない場合、以下のような「印刷中 document 中 1 ページ」のウィンドウが表示されます。筆者の環境では必要なかったので非表示としました。

動作確認

画面印刷ボタンをクリックするとOSで設定されている「通常使うプリンター」に出力されます。筆者の環境ではPDFに出力しました。

フォームの描画範囲の指定が悪いのか、ちょっとフォームの裏にある画面までキャプチャーされてしまっていますね…。

もし綺麗に画面印刷したい場合、個々で描画範囲を調節してください。

以上となります。

ここまでお読みいただきありがとうございました。

C#

Posted by だゆう