記事内にはプロモーションが含まれています

【C#】クリップボード操作をマスター!コピー・取得やListBox連携・監視など

【C#】クリップボード操作をマスター!コピー・取得やListBox連携・監視など C#

Windowsアプリケーションの開発において、データの「コピー&ペースト」はユーザーにとって最も身近で重要な機能の一つです。

C#を使って、テキストや画像をクリップボードに送ったり、逆にクリップボードの中身を取り出したりする処理は、業務効率化ツールの作成においても欠かせません。

しかし、一言にクリップボード操作と言っても、単なる文字列のやり取りだけでなく、「ListBoxの選択項目を一括コピーしたい」「クリップボードの変化を常に監視したい」、あるいは「WPFとWinFormsで書き方が違うのか?」といった実務上の疑問も多く生じます。

この記事では、C#におけるクリップボード操作の基本から、ListBoxを用いた応用、画像の扱い、そして低レベルAPIを用いた監視処理まで、現場で即戦力となる知識をサンプルコードと共に詳しく解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はプログラミングスクールを運営
  • モットーは「利他の精神」
💻 本記事の検証環境(2026年2月確認)
  • OS:Windows 11 / macOS Sequoia
  • IDE:Visual Studio / VS Code / IntelliJ IDEA
  • その他:Chrome DevTools / 各言語最新安定版

※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。

C#でクリップボードにコピー・取得する基本(Clipboardクラス)

C#でクリップボードを扱うための最も標準的な手段は、.NETが提供する Clipboard クラスを使用することです。

このクラスを使えば、複雑なメモリ管理を意識することなく、数行のコードでデータの受け渡しが可能になります。

ただし、Windows Forms(WinForms)とWPFでは参照する名前空間が異なるため、自身のプロジェクトに合わせて適切な方を選択してください。

C# クリップボード に コピーと文字列取得の書き方

まずは最も頻繁に使われる、テキストデータのコピーと取得の基本的な実装方法を見ていきましょう。

using System;
using System.Windows.Forms; // WPFの場合は System.Windows

namespace ClipboardSample
{
    class Program
    {
        static void Main()
        {
            string textToCopy = "C#でクリップボードにコピーするテストです。";

            // 1. クリップボードにテキストをセットする
            Clipboard.SetText(textToCopy);
            Console.WriteLine("クリップボードにテキストをコピーしました。");

            // 2. クリップボードから文字列を取得する
            if (Clipboard.ContainsText())
            {
                string clipboardText = Clipboard.GetText();
                Console.WriteLine($"取得したテキスト: {clipboardText}");
            }
        }
    }
}

このプログラムでは、まず Clipboard.SetText メソッドを呼び出しています。
この引数に任意の文字列を渡すだけで、OSのクリップボード領域にデータが保存され、他のエディタやブラウザなどで貼り付けができるようになります。

次にデータの取得(ペースト)処理ですが、いきなり GetText を呼ぶのではなく、Clipboard.ContainsText メソッドで「現在クリップボードにテキスト形式のデータが入っているか」を事前に確認するのが安全なプログラミングのコツです。

これにより、画像やファイルなどテキスト以外のデータが入っている場合に発生する予期せぬエラーを防ぐことができます。

条件が真であれば、Clipboard.GetText によってメモリ上の文字列を C# の変数として取り出すことができます。

クリップボードをクリア(初期化)する方法

特定の機密情報を扱った後や、処理の節目でクリップボードの中身を空にしたい場合は、Clear メソッドを使用します。

// クリップボードのデータをすべて削除する
Clipboard.Clear();

Clipboard.Clear メソッドを実行すると、現在クリップボードに保持されているすべてのデータ(テキスト、画像、オブジェクトなど)が消去されます。

セキュリティが重視されるアプリケーションにおいて、パスワードなどの情報を一時的にコピーした際、処理の最後にこのメソッドを呼んでおくことで、情報漏洩のリスクを軽減させることが可能になります。

【応用】ListBoxからのコピー実装例

実務の画面開発では、リストに並んだ項目を選択してクリップボードに送りたいという要望がよくあります。
特に、ログの一覧やIDリストなどを扱う場面で重宝されるテクニックです。

ここでは、サジェストキーワードでも注目されている「c# listbox クリップボード コピー」の具体的な実装パターンを紹介します。

ListBoxの選択項目をクリップボードにコピーする

private void CopySelectedItemsToListbox(ListBox listBox)
{
    // 選択されているアイテムがない場合は何もしない
    if (listBox.SelectedItems.Count == 0) return;

    // 選択された各項目を改行区切りの文字列にまとめる
    var items = new System.Collections.Generic.List<string>();
    foreach (var item in listBox.SelectedItems)
    {
        items.Add(item.ToString());
    }

    string joinedText = string.Join(Environment.NewLine, items);

    // まとめた文字列をクリップボードにセット
    Clipboard.SetText(joinedText);
    
    MessageBox.Show("選択した項目をコピーしました。");
}

この処理では、まず引数として受け取った ListBox コントロールの SelectedItems プロパティを参照しています。
ここにはユーザーが画面上で選択した複数の項目が格納されています。

ループ処理(foreach)を用いて、選択された各項目を一つずつ取り出し、ToString メソッドで文字列に変換した上でリストに蓄積していきます。

その後、string.Join を利用して、それぞれの単語の間に Windows 標準の改行コード(Environment.NewLine)を挟み込み、一つの大きなテキストデータとして成形しています。

最後に、完成した文字列を Clipboard.SetText に渡すことで、複数の行を一括でクリップボードに転送することに成功しています。

この手法を使えば、Excelなどにそのまま貼り付け可能な形式でデータを出力できるため、ユーザーの利便性が飛躍的に向上します。

画像データのコピーと取得テクニック

テキストだけでなく、スクリーンショットや図形をクリップボードで扱いたいケースもあります。
C#の Clipboard クラスは画像オブジェクトにも標準で対応しています。

クリップボードへの画像保存と読み込み

using System.Drawing; // 参照設定が必要
using System.Windows.Forms;

private void HandleImageInClipboard()
{
    // 1. 画像ファイルを読み込んでコピーする
    Image img = Image.FromFile("sample.png");
    Clipboard.SetImage(img);

    // 2. クリップボードから画像を取得して表示
    if (Clipboard.ContainsImage())
    {
        Image capturedImg = Clipboard.GetImage();
        // ピクチャボックスなどに表示させる処理
        // pictureBox1.Image = capturedImg;
    }
}

画像の操作には、System.Drawing 名前空間に含まれる Image クラスを使用します。
Clipboard.SetImage メソッドに画像オブジェクトを渡すことで、ビットマップデータとしてクリップボードへ格納されます。

取得時にはテキストの時と同様に、Clipboard.ContainsImage で「画像が含まれているか」をチェックします。

この確認を怠ると、テキストがコピーされている状態で画像として取り出そうとした際に、戻り値が null になってしまい、後続の描画処理で例外が発生する原因となります。

Clipboard.GetImage で取得したデータは Image 型として返ってくるため、そのまま PictureBoxImage プロパティに代入したり、ファイルとして保存したりといった二次利用がスムーズに行えます。

クリップボードの変更を検知する「監視」の実装方法

クリップボードに何かがコピーされた瞬間に、自動で特定の処理(URLの解析や翻訳など)を走らせたい場合、クリップボードの「監視」が必要になります。

これは標準の Clipboard クラスだけでは実現できず、Windows OS の深い部分の機能(Win32 API)を借りる必要があります。

監視用API(SetClipboardViewer)の活用

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public partial class ClipboardMonitorForm : Form
{
    // Windows APIのインポート
    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);

    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);

    private IntPtr _nextClipboardViewer;

    public ClipboardMonitorForm()
    {
        // 監視を開始
        _nextClipboardViewer = SetClipboardViewer(this.Handle);
    }

    protected override void WndProc(ref Message m)
    {
        const int WM_DRAWCLIPBOARD = 0x308; // クリップボード更新のメッセージ
        
        if (m.Msg == WM_DRAWCLIPBOARD)
        {
            // ここにクリップボードが変更された時の処理を書く
            OnClipboardChanged();
        }
        base.WndProc(ref m);
    }

    private void OnClipboardChanged()
    {
        if (Clipboard.ContainsText())
        {
            Console.WriteLine("新しいテキストを検知しました: " + Clipboard.GetText());
        }
    }
}

このプログラムでは、Windows OS から送られてくる「メッセージ」という信号を直接受け取るために、WndProc というメソッドをオーバーライドしています。

OS はクリップボードの内容が更新されると、登録されているアプリに対して WM_DRAWCLIPBOARD という特定の番号の信号を送信します。

この仕組みを利用するために、コンストラクタ内で SetClipboardViewer というAPIを呼び出し、自分のアプリを監視対象のリスト(クリップボードビューアチェーン)に登録しています。
信号を受け取ったタイミングで OnClipboardChanged という独自メソッドを呼び出すことで、リアルタイムな監視を実現させています。

注意すべき点として、アプリを終了する際には ChangeClipboardChain を呼び出して、自分が監視を止めることをOSに正しく伝える必要があります。
これを怠ると、他の監視アプリに信号が届かなくなるなど、OS全体の動作に悪影響を与える可能性があるため、実装には細心の注意を払いましょう。

WPFとWinForms、VB.NETでの違いと注意点

最後に、開発環境による微妙な違いについて整理しておきましょう。
特に移行作業や多言語開発を行う際に迷いやすいポイントです。

プラットフォーム別の記述差

VB.NETでクリップボードにコピーする場合は、My.Computer.Clipboard.SetText("文字列") という非常に簡潔な記法が用意されていますが、内部的には今回解説した System.Windows.Forms.Clipboard と同じ仕組みを呼び出しています。

C#から移植する場合は、名前空間を意識するだけでロジックはそのまま流用できます。

また、WPFプロジェクトでは、System.Windows.Forms を参照することも可能ですが、基本的には System.Windows.Clipboard を使うのが作法です。

WPF版の Clipboard クラスは静的メソッドであることは変わりませんが、STA(Single Thread Apartment)スレッドで呼び出す必要があるという制約がより厳格です。

もしバックグラウンドスレッドからクリップボードを操作しようとしてエラーが出る場合は、Dispatcher.Invoke を使ってメインスレッド(UIスレッド)に処理を戻す必要があることを覚えておきましょう。

C#のスキルを活かして年収を上げる方法

以上、C#でのダブルクォーテーションのエスケープ方法について解説してきました。

なお、C#のスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

業務システム開発やアプリ開発、ゲーム開発において需要の高いC#を扱えるエンジニアは、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなC#の案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
エンジニアのキャリア・スキルアップ相談窓口
当ブログの読者に選ばれている、実績豊富な転職エージェントを厳選しました。
【転職】年収・環境を改善したい
年収アップにこだわりたい方 (平均アップ額138万円の実績)
未経験・経験者問わず幅広く探したい方
業界に精通した担当者に相談したい方
ゲーム業界への転職を志望する方
エンジニア未経験からキャリアを築く方
【独立】フリーランスとして稼ぎたい
国内最大級のフリーランス案件数から比較したい方
週1〜3日など柔軟な働き方を希望する方
【学習】スキルに不安のある方向け(格安スクール「デイトラ」)
C#
スポンサーリンク
code-izumiをフォローする