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

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

源码: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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏草根专栏

用VSCode开发一个asp.net core2.0+angular5项目(5): Angular5+asp.net core 2.0 web api文件上传

这部分就讲从angular5的客户端上传图片到asp.net core 2.0的 web api. 这是需要的源码: https://pan.baidu.com...

43050
来自专栏张善友的专栏

Quartz.NET 1.0.1发布

这个版本包含1.0版本发布以来发现的bug修复,也包括使用AdoJobStore时的性能优化,增加了一个新特性是对SQL Server Compact Edit...

19960
来自专栏.net core新时代

数据字典生成工具之旅(3):PowerDesign文件组成结构介绍及操作

       从这篇开始将正式讲解整个重要部分的实现细节,本篇讲解Pdm文件的解析。其实PDM文件就是XML文件,可以用Editplus或者VS打开查看。了解到...

221100
来自专栏游戏杂谈

Unity项目中文字的统一管理

一款游戏在研发初期就需要考虑多语言的问题,否则后期在进行多国语言版本时就面临着巨大的成本。鉴于之前页游的经验,其它同事设计出读取Excel的方式来管理所有的文字...

15610
来自专栏晓晨的专栏

.NET Core 开源工具 IPTools - 快速查询 IP 地理位置、经纬度信息

快速查询中国IP地址信息,包含国家、省份、城市、和网络运营商。非中国IP只支持查询国家。

11010
来自专栏听雨堂

ASP.NET TreeView相关问题

1、用代码在treeview web控件中,添加node的方法 表字段:编号,父编号,名称 数据: 1 0 中华人民共和国 2 1 湖南 3 1 湖北...

22470
来自专栏挖掘大数据

常用的Hadoop 文件查看工具

packages.config <?xml version="1.0" encoding="utf-8"?> <packages> <package id...

22190
来自专栏菩提树下的杨过

ExtJs学习笔记(5)_Ajax示例

ExtJs对于Ajax的使用非常简单,看下面的代码: 1.Html页: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0...

22860
来自专栏hbbliyong

C# ini文件读写类

VC中提供了API函数进行INI文件的读写操作,但是微软推出的C#编程语言中却没有相应的方法,下面是一个C# ini文件读写类, 从网上收集的,很全,就是没有对...

35760
来自专栏c#开发者

MVC 5 Scaffolder + EntityFramework+UnitOfWork Pattern 代码生成工具集成Visual Studio 2013

MVC 5 Scaffolder + EntityFramework+UnitOfWork Pattern 代码生成工具 经过一个多星期的努力总算完成了单表,多...

473130

扫码关注云+社区

领取腾讯云代金券