目次

WPFでSendKeysメソッドを利用してスクリーンキャプチャを取得する - C#

WPFでSendKeysメソッドを使いスクリーンキャプチャを取得する方法を紹介します。
WPFでもWinFormアプリケーションと同様に、CopyFromScreenメソッドを使ってスクリーンキャプチャを取得することもできます。詳細はこちら

コード

private void button2_Click(object sender, RoutedEventArgs e)
{
  //アクティブウィンドウをスクリーンキャプチャする場合
  //System.Windows.Forms.SendKeys.SendWait("%{PRTSC}");

  //全画面をスクリーンキャプチャする場合
  System.Windows.Forms.SendKeys.SendWait("^{PRTSC}");

  IDataObject dobj = Clipboard.GetDataObject();
  if (dobj.GetDataPresent(DataFormats.Bitmap) == true) {
    System.Windows.Interop.InteropBitmap ibmp
      = (System.Windows.Interop.InteropBitmap)dobj.GetData(DataFormats.Bitmap);

    BmpBitmapEncoder enc = new BmpBitmapEncoder();
    //JpegBitmapEncoder enc = new JpegBitmapEncoder();//JPEGファイルで保存する場合
    enc.Frames.Add(BitmapFrame.Create(ibmp));
    System.IO.FileStream fs = new System.IO.FileStream(@"c:\data\screen2.bmp", 
      System.IO.FileMode.Create, System.IO.FileAccess.Write);
    enc.Save(fs);
    fs.Close();
    fs.Dispose(); 
  }
}

説明

System.Windows.Forms.SendKeys.SendWait("^{PRTSC}");
でプログラムからキーを送信します。 "^{PRTSC}"は Ctrl+PrintScreen キーとなります。

IDataObject dobj = Clipboard.GetDataObject();
にてクリップボードからデータを取得します。

if (dobj.GetDataPresent(DataFormats.Bitmap) == true) {
にてクリップボードから取得したデータがビットマップ形式か判定し、ブットマップ形式であるならば

InteropBitmap ibmp = (InteropBitmap)dobj.GetData(DataFormats.Bitmap);
にて画像データを取り出します。 WPFアプリケーションではWinFormアプリケーションと異なり、取り出される画像はSystem.Windows.Interop.InteropBitmap となります。(WinFormアプリケーションの場合はSystem.Drawing.Bitmap)
Bitampオブジェクトではsaveメソッドで保存しますが、InteropBitmapを保存する場合はBitmapEncoderを用いて保存します。

BmpBitmapEncoder enc = new BmpBitmapEncoder();
にて、画像を保存するためのBitmapEncorderを作成します。

enc.Frames.Add(BitmapFrame.Create(ibmp));
System.IO.FileStream fs = new System.IO.FileStream(@"c:\data\screen2.bmp",
System.IO.FileMode.Create, System.IO.FileAccess.Write);
enc.Save(fs);
fs.Close();
fs.Dispose();
BitmapEncorderを利用して画像を"c:\data"に screen2.bmpという名前で保存します。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2010-10-28
iPentec all rights reserverd.