zoukankan      html  css  js  c++  java
  • 万恶的剪贴板==》为存储而生

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

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

  • 相关阅读:
    [BAT]cmd命令之 cd /d %~dp0
    用Fiddler抓到的报文Content-Type: application/x-www-form-urlencoded,怎样解析?
    HDU 2646 栈的应用 STL
    Codeforces Round #332 (Div. 2)B. Spongebob and Joke
    Codeforces Round #311 (Div. 2)B. Pasha and Tea二分
    HDU4022 Bombing STL
    Codeforces Round #331 (Div. 2) C. Wilbur and Points
    Codeforces Round #331 (Div. 2) B. Wilbur and Array
    Codeforces Round #331 (Div. 2) A
    HDU5533(水不水?)
  • 原文地址:https://www.cnblogs.com/dunitian/p/5377031.html
Copyright © 2011-2022 走看看