C#使用WinApi操作剪切板Clipboard0Emil0

最近正好写一个程序,需要操作剪切板

功能很简单,只需要从剪切板内读取字符串,然后清空剪切板,然后再把字符串导入剪切板

我想当然的使用我最拿手的C#来完成这项工作,原因无他,因为.Net框架封装了能实现这种功能的方法

然后就有了如下代码

1stringTemp="";2while(true)3{4stringTex=Clipboard.GetText().ToString();5if(!string.IsNullOrWhiteSpace(Tex)&&Temp!=Tex)6{7Clipboard.Clear();8Clipboard.SetDataObject(Tex,false);9Temp=Tex;10}11Thread.Sleep(1);12}ViewCode这段代码,也是网页上广泛流传的,使用.Net框架操作系统剪切板的方法,当然这个方法在某些情况下很管用

不过在我这确发生了点问题,主要的问题有两点

首先,我对剪切板的操作需求有实时性,也就是,操作人员复制的一瞬间就应该截取到剪切板的数据,处理完后再放入剪切板

结果

Clipboard.SetDataObject(Tex,false);没想到上面这条设置剪切板的指令竟然会卡焦点窗口的线程,比如说,我在A软件执行了一次复制操作,如果使用了上述代码,那么A软件强制线程堵塞大概几百毫秒的样子,反正很影响体验,我推测是因为该命令会锁定内存导致的

那怎么办,本着死马当活马医的态度,我专门为该指令启用了一个线程

Task.Factory.StartNew(()=>{Clipboard.Clear();Clipboard.SetDataObject(Text,false);});使用了线程以后,因为操作滞后(线程启动会延迟一会儿,并不实时)了,所以上述问题似乎解决了,但是没想到出现了新的问题

stringTex=Clipboard.GetText().ToString();上述从剪切板获得字符串的指令,在默写情况下,会卡滞住,然后程序在一分钟之后,因为超时而被系统吊销

emmmmm,在经过几番努力之后,我终于意识到,虽然.Net封装了不少操作系统API的方法,使得一些IO操作变简单不少,但是带来的问题也是同样大的,在遇到无法解决的问题的时候,会有点束手无策

于是不得已,我只能放弃使用过C#完成该项功能,想着幸好功能简单,而且操作WinAPI其实最好的还是使用C++来写,于是我用C++复现了上述功能

那么本教程就到此为止。

想着,既然我能用C++调用WinAPI完美实现我需要的功能,而且C#也能调用非托管的代码来执行WinAPI,那么我不是可以把上面C++写的代码移植到C#里面执行?说干就干

首先,C#调用WinAPI需要先申明

[DllImport("User32")]internalstaticexternboolOpenClipboard(IntPtrhWndNewOwner);[DllImport("User32")]internalstaticexternboolCloseClipboard();[DllImport("User32")]internalstaticexternboolEmptyClipboard();[DllImport("User32")]internalstaticexternboolIsClipboardFormatAvailable(intformat);[DllImport("User32")]internalstaticexternIntPtrGetClipboardData(intuFormat);[DllImport("User32",CharSet=CharSet.Unicode)]internalstaticexternIntPtrSetClipboardData(intuFormat,IntPtrhMem);操作剪切板需要调用的API大致就上面这些

有了API以后,我们还需要自己手动封装方法

internalstaticvoidSetText(stringtext){if(!OpenClipboard(IntPtr.Zero)){SetText(text);return;}EmptyClipboard();SetClipboardData(13,Marshal.StringToHGlobalUni(text));CloseClipboard();}internalstaticstringGetText(intformat){stringvalue=string.Empty;OpenClipboard(IntPtr.Zero);if(IsClipboardFormatAvailable(format)){IntPtrptr=NativeMethods.GetClipboardData(format);if(ptr!=IntPtr.Zero){value=Marshal.PtrToStringUni(ptr);}}CloseClipboard();returnvalue;}我们也就用到两个方法,从剪切板获得文本和设置文本到剪切板,哦关于SetClipboardData的第一个参数13是怎么来的问题,其实这个剪切板的格式参数,下面有一张表,就是自从这里来的

上面两个工作做完以后,就能实现功能了,功能代码如下

varLastS=string.Empty;while(!CancelInfoClipboard.IsCancellationRequested){varTemp=ClipboardControl.GetText(ClipboardFormat.CF_UNICODETEXT);if(!string.IsNullOrEmpty(Temp)&&Temp!=LastS){ClipboardControl.SetText(Temp);LastS=Temp;}Thread.Sleep(50);}是不是和最开始展示的调用.Net框架的方法一模一样(笑),不过使用底层API实现的功能,就没有那么多乱七八糟的Bug了,自己也很清楚到底实现了啥功能,同时也收获了不少新知识(主要是非托管代码调用的时候的注意事项什么的,还有,向非托管代码传递数据的时候,最好多用Marshal类里面的方法,不然可能会出错,毕竟这个类就是专门为非托管代码而设立的)

在研究MSDN上面关于剪切板的API的时候,发现了一个函数

boolAddClipboardFormatListener(HWNDhwnd);根据描述来讲,是添加一个剪切板的监控,在剪切板有任何变动的时候,通知你所指定的句柄的窗口,我一想,这不就是我所需要的么,有了这么一个API以后,其实我上面所展示的,使用死循环轮询剪切板的方法就变得很傻逼,而且也很容易出错了,于是,基于这个新发现的API,我重新更改了全部的程序逻辑,反而比原先的实现更加简单了。

首先我们需要一个新的窗口或者控件来接收Windows消息更新后所发来的消息,只要New一个form就行

publicForm2(){InitializeComponent();AddClipboardFormatListener(this.Handle);}然后我们在初始化组件的命令后面,把使用添加剪切板监听的API把当前窗口的句柄发给系统,这样系统在接收到剪切板改变的命令后,会把消息发给当前窗口

然后我们需要复写WndProc方法

protectedoverridevoidWndProc(refMessagem){if(m.Msg==0x031D&&Onice){varTemp=ClipboardControl.GetText(ClipboardFormat.CF_UNICODETEXT);if(!string.IsNullOrEmpty(Temp)){ClipboardControl.SetText(Temp);Onice=false;}}elseif(!Onice){Onice=true;}else{base.WndProc(refm);}}privateboolOnice=true;首先WndProc如果是Form类下面一个专门用来接收系统发送过来的消息的方法

然后关于m.Msg==0x031D的0x031D在WinAPI定义上的意义是WM_CLIPBOARDUPDATE,也就是剪切板更新事件,这个通过查找MSDN能够找到

下面没有特别奇怪的函数,就是有一点需要注意,我们这里设置了剪切板数据,相当于进行了一次更新,所以会在这一瞬间再次产生剪切板更新事件,然后又会通知这个方法,然后就会形成死循环,我在这里用了一个布尔判断来通过布尔状态决定是否截取剪切板,不只有有没有更好的办法来实现

THE END
1.剪切有什么用剪切有什么用剪切可以使用CTRL+X快捷键,剪切后使用快捷键CTRL+V进行粘贴即可~https://www.wps.cn/learning/room/d/192187
2.常见问题解答在主界面“字幕特效”面板中央的“字体设置”处,有调整字体以及字体大小、颜色等各种设置功能。 我插入字幕的时间点被我搞错了,我想挪动到其他正确的时间点,应该怎样操作? 这个非常简单!爱剪辑允许您直接选中要挪走的字幕,并点击鼠标右键,在弹出的菜单中选择“剪切字幕”或用快捷键Ctrl+X,此时字幕将被剪切并消失,然...http://www.ijianji.com/faq.htm
3.Application.CutCopyMode=False有什么用Application.CutCopyMode = False有什么用 "不处于剪切或复制模式"是什么意思不设置Application....https://club.excelhome.net/thread-434093-1-1.html?_dsign=7d32e326
4.Thoughts如何将Everything神器(文件及文件夹搜索工具)用到极致呢?经过4天的不断收集、整理、测试、完善,基本上将Everything大多数常用的技巧都罗列并展示出来了,有需要的收藏吃灰吧,别忘了点赞并关注我 ? 自己经常分使用Everything来搜索文件与文件夹,它的速度非常快,也非常方便,但有些语法及技巧总是忘记,搜索网上教程...https://thoughts.teambition.com/share/64782c66664ee90042384492
1.JavaScript学习(二十三)——编辑事件(复制剪切粘贴拖动)编辑事件是在浏览器中的内容被修改或移动时所执行的相关事件哎,主要是对浏览器中被选择的内容进行复制、剪切、粘贴时的触发事件,以及在用鼠标拖动对象时所触发的一系列事件的集合。 文本编辑事件 文本编辑事件是对浏览器中的内容进行复制、剪切、粘贴和选择时所触发的事件。 https://blog.csdn.net/qq_36171287/article/details/86572569
2.剪切:不仅仅是剪与切在日常生活中,我们经常听到“剪切”这个词,它似乎是一个简单的动作,即将某物剪断或切掉。然而,在计算机领域,尤其是图形编辑和文本处理中,“剪切”有着更丰富的含义。 什么是剪切? 在计算机术语中,剪切(Cut)是指将选中的内容(如文本、图像等)从其原始位置移除,并暂时存储在剪贴板上的操作。这样,用户就可以将剪贴...http://www.130112.com/content/bxj2f1f9gcs9ywetuvmp.html
3.短视频用什么软件剪切?有哪些技巧?有哪些技巧? 短视频之所以叫短视频,主要就是它的内容不长,一般在五分钟左右,所以如果视频过长的话就需要进行剪切。还有一个重要原因就是通过剪切可以将一个视频变为新的视频。那么,短视频用什么软件剪切呢?下面我们来了解下。 短视频用什么软件剪切? 1、使用视频编辑软件:使用专业的视频编辑软件,例如Adobe Premiere...https://xueyuan.yixiaoer.cn/article/13274
4.快手用什么剪辑软件好?视频剪辑有哪些方法?快手用什么剪辑软件好? 1、快影 快影有自由分割功能,可以一键剪切视频,轻而易举剪掉不想要的视频片段,将分割的多段视频拼接在一起合成一个长视频。变速功能可以让视频的快慢节奏自由掌握。超级炫酷的倒放功能,能让你感受时光倒流的境界,会给你的剪辑效果带来不一样的视觉效果,并支持多种效果的转场、支持精美的滤镜...https://www.meixiaosan.com/article/show/7018.html
5.PS剪切图层是什么?有什么用?为何我用快捷键(ctrl+alt+g)创建不起...可以将选中的图层与背景或其他图层合并。这个功能对于调整图片结构、添加文字或其他元素非常有用。https://ask.zol.com.cn/x/20693190.html
6.临时检查请用Ctrl+V回复看看你的剪切板了有什么东东"标题:"临时检查 请用Ctrl+V 回复 看看你的剪切板了有什么东东 注意 希望豆芽们诚实作答 (*^__^...https://www.douban.com/online/10366675/discussion/22725863/
7.照片剪切用什么软件可以剪切照片的APP分享以上就是关于照片剪切用什么软件的全部内容了,这几款软件都是小编自己亲自使用过的,操作界面方面都没有什么问题,大家要是有意向都可以下载体验一下。https://m.wandoujia.com/strategy/12063468926605145682.html
8.高剪切乳化机的用途有什么呢?高剪切乳化机的用途有什么呢? 高剪切乳化机主要针对化妆品企业生产过程中水和油不相互融合的乳化设备,均匀头部的转子和格栅通过每分钟2800转的高速旋转,将材料充分粉碎,均匀混合,将获奖和油布融合在一起。 高剪切乳化机是通过连接到发动机的同质头部的高速旋转来切割、分散和碰撞材料。这样会使材料更加细腻,使油水融合...https://www.ntflk.com/news/423.html
9.procreate剪辑蒙版有什么用剪辑蒙版功能作用介绍2、剪辑蒙版的作用就是在原本图层的基础上,让新建的图层添加新的剪辑蒙版,这样的情况下进行对图层一的上色,这样不会超过图层一的绘画范围。 >>procreate蒙版和剪切蒙版的区别 以上就是小编带来的procreate剪辑蒙版有什么用?剪辑蒙版功能作用介绍,更多相关资讯教程,请关注3DM手游网。Procreate...https://app.3dmgame.com/mip/gl/302086.html
10.AE的剪切快捷键是什么?AE剪切快捷键的使用方法AE的剪切快捷键是【Ctrl+Shift+D】,下面是AE剪切快捷键的使用方法:https://www.yutu.cn/question/tiwen_161380.html
11.磁盘分区爱快iKuai5、剪切只支持同硬盘下的操作; 四、如何使用及配置举例 1、点击“快速分区”按钮,选择需要分区的硬盘,选择分区数量并分配各分区磁盘容量 2、完成分区后点击分区“设置”操作,设置分区“绑定业务”和“挂载路径”,只有“普通存储”分区支持设置挂载路径; 五、常见问题 1、分区绑定业务有什么作用? 答:不同业务绑定不...https://www.ikuai8.com/index.php?Itemid=467&id=597&option=com_content&view=article
12.JDK(javadevelopmentkit)是什么jdk有什么用电脑常识电脑基础确实jdk/bin目录下包含了所有的命令。可是有没有人想过我们用的java命令并不是 jdk/bin目录下的而是jre/bin目录下的呢?不信可以做一个实验,大家可以把jdk/bin目录下的java.exe剪切到别的地方再运行 java程序,发现了什么?一切OK! 那么有人会问了?我明明没有设置jre/bin目录到环境变量中啊?https://www.jb51.net/diannaojichu/505434.html
13.压电陶瓷的常见问题(一)如果运动是通过摩擦传递的,则最大负载将取决于接触面处的压力和静摩擦系数。例如,2MPa压力×0.2摩擦系数=0.4MPa,对于5×5mm的剪切片,它的最大剪切负载约10N。 如果使用环氧树脂粘合固定,最大剪切负载将取决于所用环氧树脂的强度。通常,环氧树脂可在5MPa的剪切应力下安全使用,在5×5mm的剪切片上使用,它的最大剪切...https://mp.ofweek.com/instrument/a945693320876
14.剪切是干什么用的?把所选中的内容移除当前板块并暂存入剪贴版中 等待被使用作粘贴内容 https://www.3d66.com/answers/question_544125.html