万恶的剪贴板==》为存储而生

近几天逆天经常大量复制粘贴一些图文信息,在某些特定的场合,图片都是无法直接粘贴进去的,就比如博客园的编辑器。

源码:https://github.com/dunitian/DNTLive/tree/master/Software/万恶剪贴板

要弄个什么还要把word里面的图片或者网上的图片先弄出来,这是多么的蛋疼啊~

于是就有了万恶的剪贴板==》为存储而生

其实是个很简单的功能点==》稍微说下核心代码

获取文本内容var dataStr = Clipboard.GetText();

获取单个图片var imgObj = Clipboard.GetImage();

获取图文格式(网页或者Word之类的)

var data = Clipboard.GetDataObject();
if (data.GetDataPresent(DataFormats.Html, true))
{
  return data.GetData(DataFormats.Html, true).ToString();
}

正则匹配图片:Regex.Matches(dataStr, @"<img([^>]*)\s*src=('|\"")([^'\""]+)('|\"")", RegexOptions.ECMAScript)

异步批量下载图片:webClient.DownloadFileAsync(uri,path)

贴代码:

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Net;
using System.Drawing.Imaging;

namespace 剪贴板
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 获取文本
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnTxt_Click(object sender, EventArgs e)
        {
            var dataStr = Clipboard.GetText();
            if (!string.IsNullOrEmpty(dataStr))
            {
                CreateDirectory("Text");
                string name = string.Format(@"Text\{0}.txt", GetNewName());
                File.WriteAllText(name, dataStr, Encoding.UTF8);
                MessageBox.Show(string.Format("操作成功,请看Text文件夹!", "逆天友情提醒"));
                OpenDirectory();
            }
            else
            {
                MessageBox.Show("剪贴板文本内容为空!", "逆天友情提醒");
            }
        }

        /// <summary>
        /// 生成页面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnPage_Click(object sender, EventArgs e)
        {
            var dataStr = GetHtmlStr();
            if (!string.IsNullOrEmpty(dataStr))
            {
                MessageBox.Show("操作成功,请看打开的页面!", "逆天友情提醒");
                OutputHtml(dataStr);
            }
            else
            {
                MessageBox.Show("剪贴板图文内容为空!", "逆天友情提醒");
            }
        }

        /// <summary>
        /// 生成文档
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void btnWord_Click(object sender, EventArgs e)
        {
            var dataStr = GetHtmlStr();
            if (!string.IsNullOrEmpty(dataStr))
            {
                MessageBox.Show("操作成功,请看打开的页面!", "逆天友情提醒");
                OutputHtml(dataStr, ".doc");
            }
            else
            {
                MessageBox.Show("剪贴板图文内容为空!", "逆天友情提醒");
            }
        }

        /// <summary>
        /// 导出图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnImg_Click(object sender, EventArgs e)
        {
            int i = 0;
            var imgObj = Clipboard.GetImage();
            var dataStr = GetHtmlStr();
            int fileCount = GetFileDrop();
            if (imgObj != null)//非HTML的单张图片
            {
                CreateDirectory("Images");
                imgObj.Save(string.Format(@"Images\{0}.png", GetNewName()), ImageFormat.Png);
                MessageBox.Show("操作成功,请看Images文件夹!", "逆天友情提醒");
                OpenDirectory();
            }
            else if (!string.IsNullOrEmpty(dataStr))
            {
                Stopwatch watch = new Stopwatch();
                watch.Start();
                i = DownloadImg(dataStr);
                watch.Stop();
                MessageBox.Show(string.Format("成功提取{0}个图片,耗时{1}。请查看Images文件夹", i, watch.Elapsed), "逆天友情提醒");
                OpenDirectory();
            }
            else if (fileCount > 0)
            {
                MessageBox.Show(string.Format("成功提取{0}个图片,请查看Images文件夹", fileCount), "逆天友情提醒");
                OpenDirectory();
            }
            else
            {
                MessageBox.Show("剪贴板图片信息为空!", "逆天友情提醒");
            }
        }

        /// <summary>
        /// 本地图片-文件路径
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        private int GetFileDrop()
        {
            int i = 0;
            var data = Clipboard.GetDataObject();
            if (data.GetDataPresent(DataFormats.FileDrop, true))
            {
                string[] objs = (string[])data.GetData(DataFormats.FileDrop, true);
                if (objs != null)
                {
                    CreateDirectory("Images");
                    for (int j = 0; j < objs.Length; j++)
                    {
                        File.Copy(objs[i], GetNewName());
                        i++;
                    }
                }
            }
            return i;
        }

        /// <summary>
        /// 批量下载图片
        /// </summary>
        /// <param name="dataStr">页面字符串</param>
        /// <param name="i">成功条数</param>
        /// <returns></returns>
        private static int DownloadImg(string dataStr)
        {
            int i = 0;
            var collection = Regex.Matches(dataStr, @"<img([^>]*)\s*src=('|\"")([^'\""]+)('|\"")", RegexOptions.ECMAScript);
            WebClient webClient = new WebClient();
            foreach (Match item in collection)
            {
                string imgPath = item.Groups[3].Value;
                try
                {
                    CreateDirectory("Images");
                    webClient.DownloadFileAsync(new Uri(imgPath), string.Format(@"Images\{0}.png", Path.GetFileName(imgPath)));//剪贴板的图片没有相对路径
                    i++;
                }
                catch (Exception ex) { File.WriteAllText("log.dnt", ex.ToString(), Encoding.UTF8); }
            }
            return i;
        }

        /// <summary>
        /// 清除剪贴板
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lbl1_Click(object sender, EventArgs e)
        {
            ClearClipboard();
            MessageBox.Show("剪贴板清除成功!", "逆天友情提醒");
        }

        #region 公用方法        
        /// <summary>
        /// HTML字符串
        /// </summary>
        /// <returns></returns>
        private static string GetHtmlStr()
        {
            var data = Clipboard.GetDataObject();
            if (data.GetDataPresent(DataFormats.Html, true))
            {
                return data.GetData(DataFormats.Html, true).ToString();
            }
            return string.Empty;
        }

        /// <summary>
        /// 输出HTML文件
        /// </summary>
        /// <param name="dataStr"></param>
        /// <param name="ext"></param>
        private static void OutputHtml(string dataStr, string ext = ".html")
        {
            CreateDirectory("Page");
            string name = string.Format(@"Page\{0}{1}", GetNewName(), ext);
            File.WriteAllText(name, dataStr.Substring(dataStr.IndexOf("<html")), Encoding.UTF8);//除去版权信息
            Process.Start(name);
        }

        /// <summary>
        /// 打开目录
        /// </summary>
        private static void OpenDirectory()
        {
            var result = MessageBox.Show("是否打开文件夹?", "逆天提醒", MessageBoxButtons.YesNo);
            if (result == DialogResult.Yes)
                Process.Start("explorer.exe ", string.Format(@"{0}\images", Directory.GetCurrentDirectory()));//打开目录
        }

        /// <summary>
        /// 生成新名称-就不用 Guid 了,普通用户看见了会怕
        /// </summary>
        /// <returns></returns>
        private static string GetNewName()
        {
            return DateTime.Now.ToString("yyyy-MM-dd~HH.mm.ss.fff");
        }

        /// <summary>
        /// 创建文件夹
        /// </summary>
        private static void CreateDirectory(string name)
        {
            if (!Directory.Exists(name))
            {
                Directory.CreateDirectory(name);
            }
        }

        /// <summary>
        /// 清除剪贴板
        /// </summary>
        private void ClearClipboard()
        {
            Clipboard.Clear();
        }

        #endregion
    }
}

  

源码地址:http://pan.baidu.com/s/1b0ajxW

备用地址:https://github.com/dunitian/DNTLive/tree/master/Software/万恶剪贴板

posted @ 2016-04-11 08:57  毒逆天  阅读(495)  评论(0编辑  收藏  举报