.NET TIPS

クリップボードへデータを送るには?

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

 クリップボードからデータを受け取る方法については「TIPS:クリップボードからデータを受け取るには?」で解説した。本稿では逆に、クリップボードへデータを送る(データをコピーする)ための基本的なコーディングについて解説する。

テキストのコピー

 まず、テキスト(文字列)のクリップボードへのコピーだが、これは非常に簡単で、その文字列をClipboardクラス(System.Windows.Forms名前空間)の静的なメソッドであるSetDataObjectメソッドで指定するだけだ。

Clipboard.SetDataObject("クリップボードへコピー");

 ただし、このメソッドにより格納したクリップボードのデータは、メソッドを呼び出しているアプリケーションを終了すると消えてしまう。アプリケーションが終了してもクリップボードにデータを残したままにするには、2つのパラメータを取るSetDataObjectメソッドを使用し、その第2パラメータでtrueを指定すればよい(上記の呼び出し例は第2パラメータでfalseを指定した場合と同じ)。

Clipboard.SetDataObject("クリップボードへコピー", true);

 次のサンプル・プログラムは、コマンドラインのパラメータで指定されたテキスト・ファイルを読み込み、このメソッドを利用してその内容をクリップボードに送るコンソール・アプリケーションである。

// file2clip.cs

using System.IO;
using System.Windows.Forms;

class FileToClipboard {
  static void Main(string[] args) {

    StreamReader sr = new StreamReader(args[0],
        System.Text.Encoding.GetEncoding("Shift_JIS"));
    string text = sr.ReadToEnd();
    sr.Close();

    Clipboard.SetDataObject(text, true);
  }
}

// コンパイル方法:csc file2clip.cs
指定されたファイルを読み込みクリップボードに送るC#のサンプル・プログラム(file2clip.cs)
 
' file2clip.vb

Imports System.IO
Imports System.Windows.Forms

Class FileToClipboard
  Shared Sub Main(ByVal CmdArgs() As String)

    Dim sr As StreamReader = New StreamReader(CmdArgs(0), _
        System.Text.Encoding.GetEncoding("Shift_JIS"))
    Dim text As String = sr.ReadToEnd()
    sr.Close()

    Clipboard.SetDataObject(text, True)
  End Sub
End Class

' コンパイル方法:vbc /r:System.Windows.Forms.dll file2clip.vb
指定されたファイルを読み込みクリップボードに送るVB.NETのサンプル・プログラム(file2clip.vb)

 なお、ファイルの読み込みについては「TIPS:テキスト・ファイルの内容を読み込むには?」で解説している。

画像のコピー

 画像(ビットマップ)のクリップボードへの送信も、テキストの場合と同様にSetDataObjectメソッドを使って簡単に行える。例えば、画像ファイルを読み込んだBitmapオブジェクト(Bitmapクラス(System.Drawing名前空間)のオブジェクト)を参照している変数bmpがあるとすると、それをクリップボードに送信するには次のように記述すればよい(より具体的な例は後述)。

Clipboard.SetDataObject(bmp);

複数のデータ形式でコピー

 ところで、クリップボードは1つのデータを複数のデータ形式で保持することができるが、そのような複数形式のデータを送信するにはどうすればよいだろうか。上述したようなSetDataObjectメソッドの呼び出しを何回行っても、後から送信したデータでクリップボードの内容が置き換わるだけである。

 このような場合には、まず複数のデータを格納可能なDataObjectクラス(System.Windows.Forms名前空間)を使用してクリップボードに送信するデータを作成する。そして、そのDataObjectオブジェクトをClipboardクラスのSetDataObjectメソッドで送信すればよい。DataObjectオブジェクトにデータを“追加”するには、SetDataメソッドを使用する。コードの記述例は次のようになる。

DataObject data = new DataObject();
data.SetData(text);
data.SetData(bmp);
Clipboard.SetDataObject(data, true);

 次のサンプル・プログラムでは、テキスト形式とビットマップ形式の2つのデータ形式を使ってクリップボードにデータを送信している。送信するビットマップは、文字列をグラフィックで描画したものだ。ビットマップを作成する処理は、プログラム内のCreateTextBitmapメソッドにまとめている。このメソッドは、パラメータで指定された文字列を、指定された文字サイズで描画したBitmapオブジェクトを返す。

// setclpbrd.cs

using System;
using System.Drawing;
using System.Drawing.Text;
using System.Windows.Forms;

public class SetClipboard {

  static Bitmap CreateTextBitmap(int size, string text) {

    // 指定されたサイズのフォントを作成
    Font myFont = new Font("MS ゴシック", size, FontStyle.Bold);

    // テキストの描画に必要なビットマップのサイズを測定
    Bitmap bmp = new Bitmap(1, 1);
    Graphics g = Graphics.FromImage(bmp);
    SizeF bmpSize = g.MeasureString(text, myFont);

    // 必要なビットマップの幅と高さ
    int w = (int)bmpSize.Width;
    int h = (int)bmpSize.Height;

    // ビットマップを作成し、テキストを描画
    bmp = new Bitmap(w, h);
    g = Graphics.FromImage(bmp);
    g.FillRectangle(Brushes.Green, 0, 0, w, h);
    g.TextRenderingHint = TextRenderingHint.AntiAlias;
    g.DrawString(text, myFont, Brushes.White, 0, 0);

    return bmp;
  }

  static void Main() {
    string text = "こんにちわ .NET";
    Bitmap bmp = CreateTextBitmap(30, text);

    DataObject data = new DataObject();

    data.SetData(text);
    data.SetData(bmp);
    Clipboard.SetDataObject(data, true);
  }
}

// コンパイル方法:csc setclpbrd.cs
テキスト形式とビットマップ形式のデータをクリップボードに送信するサンプル・プログラム(setclpbrd.cs)
 
' setclpbrd.vb

Imports System
Imports System.Drawing
Imports System.Drawing.Text
Imports System.Windows.Forms

Class SetClipboard
  Shared Function CreateTextBitmap(ByVal size As Int32, ByVal text As String) As Bitmap
    ' 指定されたサイズのフォントを作成
    Dim myFont As Font = New Font("MS ゴシック", size, FontStyle.Bold)

    ' テキストの描画に必要なビットマップのサイズを測定
    Dim bmp As Bitmap = New Bitmap(1, 1)

    Dim g As Graphics = Graphics.FromImage(bmp)
    Dim bmpSize As SizeF = g.MeasureString(text, myfont)

    ' 必要なビットマップの幅と高さ
    Dim w As Int32 = CType(bmpSize.Width, Int32)
    Dim h As Int32 = CType(bmpSize.Height, Int32)

    ' ビットマップを作成し、テキストを描画
    bmp = New Bitmap(w, h)
    g = Graphics.FromImage(bmp)
    g.FillRectangle(Brushes.Green, 0, 0, w, h)
    g.TextRenderingHint = TextRenderingHint.AntiAlias
    g.DrawString(text, myFont, Brushes.White, 0, 0)

    Return bmp
  End Function

  Shared Sub Main()
    Dim text As String = "こんにちわ .NET"
    Dim bmp As Bitmap = CreateTextBitmap(30, text)

    Dim data As DataObject = New DataObject

    data.SetData(text)
    data.SetData(bmp)
    Clipboard.SetDataObject(data, True)
  End Sub
End Class

' コンパイル方法:vbc /r:System.Windows.Forms.dll /r:System.Drawing.dll setclpbrd.vb
テキスト形式とビットマップ形式のデータをクリップボードに送信するサンプル・プログラム(setclpbrd.vb)

 このプログラムを実行してから、「TIPS:クリップボードからデータを受け取るには?」で示した、クリップボードのデータを表示するサンプル・プログラムを実行してボタンをクリックすれば、次のような画面になるはずだ。

クリップボードに格納されたテキストと画像を表示するサンプル・プログラム
このサンプル・プログラムについては「TIPS:クリップボードからデータを受け取るには?」で解説している。

 これは、「こんにちわ .NET」という文字列が、テキストおよび画像としてクリップボードに格納されていることを示している。End of Article

カテゴリ:Windowsフォーム 処理対象:クリップボード
使用ライブラリ:Clipboardクラス(System.Windows.Forms名前空間)
使用ライブラリ:Bitmapクラス(System.Drawing名前空間)
使用ライブラリ:DataObjectクラス(System.Windows.Forms名前空間)
関連TIPS:クリップボードからデータを受け取るには?
関連TIPS:
テキスト・ファイルの内容を読み込むには?
 
この記事と関連性の高い別の.NET TIPS
クリップボードからデータを受け取るには?
クリップボードの内容をリアルタイムに取得するには?
Visual StudioのコードをHTML形式でクリップボードにコピーするには?
アプリケーション画面のハードコピーを保存するには?
[ASP.NET]データベースの内容をクライアントにダウンロード提供するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間