クリップボード操作ソフトを作ってみた

2019年3月22日C#, プログラミング

ブログ用にクリップボードソフト作成中

ブログにキャプチャを貼る際にコピペでキャプチャを貼りたいと考え、画像データをファイルデータにコンバートしてクリップボードに格納するWindowsアプリを作成中。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnChange_Click(object sender, EventArgs e)
        {
            //クリップボードの画像を取得
            var clip = Clipboard.GetDataObject();
            // 画像ファイルのみ取り込み
            var bmp = clip.GetData(typeof(Bitmap)) as Bitmap;
            if (bmp == null) return;
            
            ImageFormat fmt = ImageFormat.Bmp;
            fmt = ImageFormat.Jpeg;
            bmp.Save(AppDomain.CurrentDomain.BaseDirectory + "temp.jpg", fmt);


            IDataObject data = new DataObject(DataFormats.FileDrop, AppDomain.CurrentDomain.BaseDirectory + "temp.jpg");
            //クリップボードにコピーする
            Clipboard.SetDataObject(data);
        }
    }
}

んー

動かないよ。画像ファイルはできるんだけど、ファイルとしてクリップボードに格納されない。

何が行けないのか見当がつかない。

今日はここまで。

クリップボードツール

WordPressにコピペで画像を貼りたくて、クリップボードの画像データを画像ファイルに変換するC#アプリを作っては見たものの、ファイルにしたからと言って無理でした。

Web見ていると、別サイトの画像を右クリックの「画像コピー」でコピーすると、Wordpressでそのままコピーできると書いてあったので試してみたら、確かにできた!

でも、なぜ?

クリップボードの中身を見ると、画像コピーでは画像データと共にHTMLフォーマットもコピーしているみたい。そこにURLデータがあり、WordpressはURLデータを見て、自動でリンクを張っているみたいでした。

これだと、実ファイルは別サーバーなのでちょっとやりたいこととは違っていました。

どうする?

いろいろ調べたのですが、次のような対策を考えてみました。

  • ファイルコピー時に、ファイルとパスを同時コピーし、画像アップロードにパスをペーストしてアップロード
  • スクリーンショットファイルをドラッグ&ドロップできるようにアプリ上に表示し、Wordpressにドロップ
  • WordPressのプラグイン「OnePress Image Elevator」を使う

C#実装方法を調べておいて何ですが、OnePress Image Elevatorを使うのが現状一番スマートな気がしてきました。

おまけ

こんな感じのアプリを書いていました。ただ、これだとファイル名が固定「temp.png」なのでアップロード時にファイル名かぶりが生じます。ちょっと嫌やな~