C#のWinFormsでCtrl+Vで画像を貼り付けてドラックアンドドロップで取り出す。

コンピュータ

クリップボードにコピーされている画像をCtrl+Vでフォームに貼り付けファイル名を日時.pngで自動保存。画像をドラックすると保存されたPNGファイルを他のアプリケーションへドロップ出来るようにします。

想定される使い方として、アプリケーションAが画像をクリップボードにコピー(Ctrl+C)する機能があり、アプリケーションBが画像ファイルをドラックアンドドロップで受け入れる機能がある場合、その2つのアプリケーションの仲介をするツールになります。

using System.Diagnostics;
using System.Drawing.Imaging;

namespace ClipImage01;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // Image
        Image? img = null;
        // ImageFile
        string? imageFile = "";
        // ピクチャボックス
        PictureBox picbox = new()
        {
            Dock = DockStyle.Fill,
            Parent = this,
        };

        // Picturesフォルダのパスを取得
        string imgDir = Path.Join(
            Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
            @"ClipImage"
        );
        // ディレクトリの作成
        if (Directory.Exists(imgDir) == false)
        {
            Directory.CreateDirectory(imgDir);
        }
        // 画像の自動保存のパスを生成
        Func<string> CreateImagePath = new(() =>
        {
            var basename = DateTime.Now.ToString("yyyyMMddHHmmss");
            var path = Path.Join(imgDir, basename+".png");
            return path ?? "test.png";
        });

        // キーボードイベントをフォームで受け取る
        this.KeyPreview = true;
        // キーボードイベント
        this.KeyDown += async (s, e) =>
        {
            // Ctrl+V
            if ((e.Modifiers & Keys.Control) == Keys.Control && e.KeyCode == Keys.V)
            {
                img?.Dispose();
                // クリップボードから画像を取り出し
                img = Clipboard.GetImage();
                if (img is not null)
                {
                    imageFile = CreateImagePath();
                    // イメージオブジェクトを保存
                    await Task.Run(()=>{img.Save(imageFile, ImageFormat.Png);});
                    // ピクチャボックスを再描画
                    picbox.Invalidate();
                }
            }
        };
        // ペイントイベント
        picbox.Paint += (s, e) =>
        {
            if (img is null) return;
            
            var g = e.Graphics;
            g.DrawImage(img, 0, 0);
        };
        // マウスボタンが押された
        picbox.MouseDown += (s, e) =>
        {
            // イメージオブジェクトがセットされていない場合何もしないで返る
            if (img is null || imageFile is null) return;
            // 押されたマウスのボタンが左でない場合も何もしないで返る
            if (e.Button != MouseButtons.Left) return;

            var effect = DragDropEffects.Copy | DragDropEffects.Move;
            string[] paths = {imageFile};

            IDataObject data = new DataObject(DataFormats.FileDrop, paths);
            // ドラックアンドドロップ実行
            var result = picbox.DoDragDrop(data, effect);

            if ( result == DragDropEffects.None)
            {
                MessageBox.Show(string.Format("{0} D&D 失敗", imageFile));
            }
        };
    }
}

画像の保存先のフォルダはユーザーのPicturesフォルダの下にClipImageという名前のフォルダが作成されますので、そちらに画像が保存されます。

コメント