开发者社区> 浣熊干面包> 正文

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

简介:
+关注继续查看

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

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

贴代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
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/万恶剪贴板


本文转自毒逆天博客园博客,原文链接:http://www.cnblogs.com/dunitian/p/5377031.html,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
5款经典代码阅读器的使用方案对比
代码阅读是技术人的必备技能之一,高效地梳理代码能够极大程度上提高开发人员的工作效率,进一步为业务创造新价值。
490 0
巧用生活号icon菜单和功能扩展区,更快传达你的服务!
01 你用icon菜单了吗?   还在使用单一的文字菜单? 想要表达内容太多,只能深深藏进二级菜单? 那么,建议你试试icon菜单。 简单直白,你所能提供的服务 一.目.了.然 | 杭州市民卡,利用icon菜单,所有服务一目了然,菜单点击数据直线上升;  02 功能扩展区启用了吗?   用图文推送来宣传活动?吸引点击? 可是,图文很快就会被覆盖。
356 0
重构后的Firefox网络监视工具,里边加了什么黑科技?
本文讲的是重构后的Firefox网络监视工具,里边加了什么黑科技?,Firefox开发工具的早期版本已经在Firefox中提供了网络监视器工具,任何关心页面加载性能和网页运行速度的用户都非常喜欢这个工具。
1388 0
【干货】设计高性能无限滚动加载,了解高效页面秘密
本文通过代码实例,来实现一个无限滚动加载效果。更重要的是,在实现过程中,对于页面性能的分析和处理力图做到最大化,希望对读者有所启发
2750 0
【开源】1句代码搞定图片批量上传,无需什么代码功底【无语言界限】
开源地址:https://github.com/dunitian/LoTUploader WebUploader基础上的封装改善,一句代码全部实现(样式美化,实例JS优化(配置优化,样式调整,名称+大小显示,错误处理等),后端代码。
772 0
(十八)WebGIS中清空功能和地图定位功能的设计以及实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.背景 当地图中增加了很多元素后,对不同的元素需要进行一定的控制,最简单的控制就是能对元素有选择的进行清空删除。
620 0
安卓开发_数据存储技术_内部存储
安卓内部存储就是将信息保存在一个文件中放入手机内部一个特定的目录下,特别要注意,这里的内部存储不是内存存储。内部存储是系统中一个很特殊的位置。 读取数据都是根据文件名称来执行 下面根据一个简单的Demo来学习下内部存储 一、先看下Demo布局 功能就是: 1、输入文件名 和文件内容点击...
793 0
跨浏览器的剪贴板访问解决方案
在IE中,JS可以直接访问剪贴板,但是firefox,chrome等其它"高级"浏览器,就没这么幸运了。网上流传的所谓兼容firefox/IE的剪贴板访问javascript代码,都是N年前的往事了。 根据http://mozilla.com.cn/post/49413/ 上的说法: ---------------------------------- 火狐不允许网页操作用户的剪切板,因为有安全问题,网页可能盗用你复制的密码等等。
1105 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
《解决方案A4折页-游戏_复制》
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载