.NET TIPS

アプリケーション画面のハードコピーを保存するには?

デジタルアドバンテージ
2004/05/07

 Windowsアプリケーションで画面のキャプチャ(画面のハードコピーの取得)を行い、それをファイルに保存する場合には、その機能を独自に実装する必要がある。もちろん画面キャプチャ・ソフトを使ってもよいし、[Alt]キー+[Print Screen]キーを利用してウィンドウのスクリーン・ショットをクリップボードにコピーし、それを画像処理ソフトなどにペースト(貼り付け)してから保存することも可能だ(これについてはWindows TIPS:「アクティブウィンドウだけをキャプチャする方法」で解説されている)。

 しかし、後者の[Alt]キー+[Print Screen]キーによる方法をプログラムから実行することにより、画面キャプチャをファイルに保存するという機能を簡単にアプリケーションに追加することができる。このための具体的な手順は次のようになる。

  1. [Alt]キー+[Print Screen]キーを自分自身に送る
  2. クリップボードに格納されたキャプチャ画像を取得する
  3. 取得した画像をファイルに保存する

 この手順のうち、2.と3.については「TIPS:クリップボードからデータを受け取るには?」と「TIPS:画像をファイルに保存するには?」で解説しているので、詳しくはそちらを参照していただきたい。

アプリケーションへのキーストロークの送信

 アプリケーションへのキー入力の送信は、SendKyesクラス(System.Windows.Forms名前空間)のSendWaitメソッドを使用すればよい。このメソッドは、パラメータで指定されたキーストロークをアクティブなアプリケーションに送信し、それが処理されるまで待機する(これにより、ユーザーがアプリケーションに対してキー入力を行った場合と同等な状況を作り出すことができる)。

 SendWaitメソッドのパラメータには、送信するキーストロークを文字列として記述する。[Print Screen]キーなどの特殊なキーは、“{PRTSC}”のように、あらかじめ定められたコードにより記述できる(コードの一覧はリファレンス・マニュアルのSendKeysクラスの項目に記載されている)。また、[Alt]キーとの組み合わせとして送信する場合には、そのコードの前に“%”を付ければよい。

 よって、[Alt]キー+[Print Screen]キーの組み合わせをアプリケーションに送信するには、次のような記述となる*

SendKeys.SendWait("%{PRTSC}");

* プログラムからアプリケーションにキーを直接送信して画面キャプチャを行う場合には、[Print Screen]キーだけを送信しても、そのアプリケーション単体の画面キャプチャが行えるようである(全画面のキャプチャとはならない)。

画面キャプチャをファイルに保存するサンプル・プログラム

 画面キャプチャ機能を追加したWindowsアプリケーションを実際に作成してみよう。ここでは、フォーム上に配置した[画面キャプチャ]ボタンが押された場合に、画面のハードコピーを「c:\screen.jpg」というファイル名のJPEGファイルとして保存するものとする。

 まず、Visual Studio .NETでWindowsアプリケーションのプロジェクトを作成し、次の図のようにTextプロパティを「画面キャプチャ」に設定したButtonコントロールを適当な位置に配置する。キャプチャされたことが確認しやすいように、ここではボタン以外にもいくつかのコントロールをフォームに配置している。

[画面キャプチャ]ボタンと適当なコントロールを配置したWindowsフォーム

 次に、いま配置した[画面キャプチャ]ボタンをダブルクリックし、次のコードを記述する。

private void button1_Click(object sender, System.EventArgs e) {
  // [Alt]キー+[Print Screen]キーの送信
  SendKeys.SendWait("%{PRTSC}");

  // クリップボードに格納された画像の取得
  IDataObject data = Clipboard.GetDataObject();
  if (data.GetDataPresent(DataFormats.Bitmap)) {
    Bitmap bmp = (Bitmap)data.GetData(DataFormats.Bitmap);
    // 取得した画像の保存
    bmp.Save(@"c:\screen.jpg", ImageFormat.Jpeg);
  }
}
[画面キャプチャ]ボタンをダブルクリックして記述するコード(C#)
 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  ' [Alt]キー+[Print Screen]キーの送信
  SendKeys.SendWait("%{PRTSC}")

  ' クリップボードに格納された画像の取得
  Dim data As IDataObject = Clipboard.GetDataObject()
  If Data.GetDataPresent(DataFormats.Bitmap) = True Then
    Dim bmp As Bitmap = CType(data.GetData(DataFormats.Bitmap), Bitmap)
    ' 取得した画像の保存
    bmp.Save("c:\screen.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
  End If
End Sub
[画面キャプチャ]ボタンをダブルクリックして記述するコード(VB.NET)

 プログラムを実行して[画面キャプチャ]ボタンを押せば、Cドライブのルート・ディレクトリに「screen.jpg」というJPEGファイルが作成されているはずだ。End of Article

カテゴリ:Windowsフォーム 処理対象:キーボード
カテゴリ:Windowsフォーム 処理対象:クリップボード
使用ライブラリ:SendKyesクラス(System.Windows.Forms名前空間)
使用ライブラリ:Clipboardクラス(System.Windows.Forms名前空間)
使用ライブラリ:IDataObjectインターフェイス(System.Windows.Forms名前空間)
使用ライブラリ:DataFormatsクラス(System.Windows.Forms名前空間)
関連TIPS:クリップボードからデータを受け取るには?
関連TIPS:
画像をファイルに保存するには?
 
この記事と関連性の高い別の.NET TIPS
スクリーンやウィンドウをキャプチャするには?
フォームやコントロールの画像をファイルに保存するには?
クリップボードへデータを送るには?
Windowsアプリケーションの位置やサイズを保存するには?
クリップボードからデータを受け取るには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間