lipboard의 format을 조사하는 도구 만들기

18428 단어 클립보드C#.NET
Excel이나 Word의 형식을 조사해 결과를 정리할까라고 생각했지만, 지루해서, 조사하기 위해서 만든 툴만 두어 본다.

화면 캡처



Excel 2016에서,

를 선택하여 복사한 경우의 결과가 아래 그림.Csv 는 왜인가 String 는 아니고 MemoryStream 같다.



소스 코드



using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;

class ClipboardTest : Form
{
    ListView lsv;
    TextBox txtDestFilepath;
    Button btnGetList;
    Button btnSaveFile;

    ClipboardTest()
    {        
        txtDestFilepath = new TextBox();
        txtDestFilepath.Text = (new FileInfo("out_dat")).FullName;
        txtDestFilepath.ReadOnly = true;
        txtDestFilepath.Width = 400;
        Controls.Add(txtDestFilepath);

        btnGetList = new Button();
        btnGetList.Text = "Get Format List";
        btnGetList.Size = new Size(150, 30);
        btnGetList.Location = new Point(0,40);
        btnGetList.Click += (sender,e)=>{ListupClipboardFormat();};
        Controls.Add(btnGetList);

        btnSaveFile = new Button();
        btnSaveFile.Text = "Save as selected format";
        btnSaveFile.Size = new Size(150, 30);
        btnSaveFile.Location = new Point(0,80);
        btnSaveFile.Click += (sender,e)=>{SaveClipboardData();};
        btnSaveFile.Enabled = false;
        Controls.Add(btnSaveFile);

        lsv = new ListView();
        lsv.Location = new Point(0, 120);
        lsv.Size = new Size(400,400);
        lsv.View = View.Details;
        lsv.FullRowSelect = true;
        lsv.GridLines = true;
        lsv.HideSelection = false;
        lsv.Columns.Add("Format", 200);
        lsv.Columns.Add("Class",  180);
        Controls.Add(lsv);

        ClientSize = new Size(400,560);
    }


    void SaveClipboardData()
    {
        var items = lsv.SelectedItems;
        if (items.Count != 1) {
            return;
        }

        try {
            btnSaveFile.Enabled = false;
            string fmt = items[0].SubItems[0].Text;
            //Console.WriteLine(fmt);
            SaveClipboardDataAs(txtDestFilepath.Text, fmt);
        }
        finally {
            btnSaveFile.Enabled = true;
        }
    }

    static void SaveClipboardDataAs(string destPath, string fmt)
    {
        IDataObject data = Clipboard.GetDataObject();

        object t = data.GetData(fmt);
        if (t is string) {
            File.WriteAllText(destPath+".txt", t as string);
            //Console.WriteLine(t);
        }
        else if (t is MemoryStream) {
            var ms = t as MemoryStream;
            using ( var fs = new FileStream(destPath+".dat", FileMode.Create) ) {
                ms.WriteTo(fs);
            }
        }
        else if (t is Bitmap) {
            Bitmap bmp = t as Bitmap;
            bmp.Save(destPath+".png", ImageFormat.Png);
        }
        else {
            MessageBox.Show("Not supported.");
        }
    }

    void ListupClipboardFormat()
    {
        lsv.Items.Clear();
        lsv.BeginUpdate();
        try {
            IDataObject data = Clipboard.GetDataObject();
            if (data != null) {
                foreach (string fmt in data.GetFormats()) {
                    object tmp = data.GetData(fmt);
                    string typeName = "<null>";
                    if ( tmp != null ) {
                        typeName = tmp.GetType().ToString();
                    }
                    lsv.Items.Add(new ListViewItem(new string[]{fmt,typeName}));
                    Console.WriteLine(fmt+"\t"+typeName);
                }
            }
        }
        finally {
            lsv.EndUpdate();
        }
        if ( lsv.Items.Count >= 1 ) {
            btnSaveFile.Enabled = true;
        }
    }

    [STAThread]
    static void Main(string[] args)
    {
        Application.Run(new ClipboardTest());
    }
}


덧붙여 - HTML 형식에서 깨지는 경우가 있다



이 기사 에 기재되어 있습니다.

좋은 웹페이지 즐겨찾기