专栏首页逸鹏说道万恶的剪贴板==》为存储而生

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

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

源码: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/万恶剪贴板

本文分享自微信公众号 - 我为Net狂(dotNetCrazy),作者:毒逆天

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-04-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Dapper扩展之~~~Dapper.Contrib

    平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html#skill 上一篇文章...

    逸鹏
  • C#注册表情缘

    记得当时刚接触C#的时候,喜欢编写各种小软件,而注册表系列和网络系列被当时的我认为大牛的必备技能。直到我研究注册表前一天我都感觉他是那么的高深。 今天正好有空,...

    逸鹏
  • Python3 与 C# 基础语法对比(Function专栏)

    汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai

    逸鹏
  • Rafy 框架 - 执行SQL或存储过程

    有时候,开发者不想通过实体来操作数据库,而是希望通过 SQL 语句或存储过程来直接访问数据库。Rafy 也提供了一组 API 来方便实现这类需求。 IDbAcc...

    用户1172223
  • Redis介绍使用及进阶

    1、 高性能-- Redis能读的速度是110000次/s,写的速度是81000次/s 、c语言实现距离系统更近、数据存储在内存中、采用了epoll,非阻塞I/...

    小世界的野孩子
  • 物联网知识科普(4)——室内实时定位技术及原理

    RTLS即 Real Time Location Systems的简称,实时定位系统。

    物流IT圈
  • Flask-12 自定义错误页面

    在Flask_Blog\flaskblog下新建文件夹errors,并在Flask_Blog\flaskblog\errors下新建一个空的__init__.p...

    亚乐记
  • ASP.NET Core 2.0下使用log4net记录文件日志

    我们知道log4net的日志功能非常强大,而使用方法也比较复杂;在ASP.NET Core 2.0下,可以通过一个第三方的扩展方法来降低我们的使用难度,具体使用...

    徐大嘴
  • PHP上传图片到数据库并显示的实例代码

    砸漏
  • 初识Java

    为了让Java能够实现跨平台,Java的发明者们增加了一个抽象层,即JVM(Java Virtual Machine,Java虚拟机),自定义一套指令并且和硬件...

    木可大大

扫码关注云+社区

领取腾讯云代金券