关于C#监视剪贴板信息

##1、常规方法
在C#中,有一个常规检测剪贴板的方法,用的是 System.Windows.Forms.Clipboard;

使用起来很简单,代码如下:

/// <summary>
/// 设置剪贴板的文本内容
/// </summary>
/// <param name="s">文本内容</param>
public static void SetText(string s)
{Clipboard.SetDataObject(s ?? "");
}/// <summary>
/// 获取剪贴板中的文本内容
/// </summary>
/// <returns>返回剪贴板文本</returns>
public static string GetText()
{IDataObject iData = Clipboard.GetDataObject();return (string)iData.GetData(DataFormats.Text);
}/// <summary>
/// 获取剪贴板位图格式数据(比如从画图软件里复制的图片……)
/// </summary>
/// <returns>位图</returns>
public static Bitmap GetBitmap()
{IDataObject iData = Clipboard.GetDataObject();//确定此实例中存储的数据是否与指定的格式关联,或是否可以转换成指定的格式if (iData.GetDataPresent(DataFormats.Bitmap)){Bitmap bt = (Bitmap)iData.GetData(DataFormats.Bitmap);return bt;}return null;
}

##2、通知检测剪贴板
常规方法没有通知来告诉我们有数据,所以再来一个带通知的方案:

这个代码比较长……

public partial class Form2 : Form
{IntPtr nextClipboardViewer;public Form2(){InitializeComponent();nextClipboardViewer = (IntPtr)SetClipboardViewer((int)Handle);}/// <summary>/// 要处理的 WindowsSystem.Windows.Forms.Message。/// </summary>/// <param name="m"></param>protected override void WndProc(ref Message m){// defined in winuser.hconst int WM_DRAWCLIPBOARD = 0x308;const int WM_CHANGECBCHAIN = 0x030D;switch (m.Msg){case WM_DRAWCLIPBOARD:DisplayClipboardData();SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);break;case WM_CHANGECBCHAIN:if (m.WParam == nextClipboardViewer)nextClipboardViewer = m.LParam;elseSendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);break;default:base.WndProc(ref m);break;}}/// <summary>/// 显示剪贴板内容/// </summary>public void DisplayClipboardData(){try{IDataObject iData = new DataObject();iData = Clipboard.GetDataObject();if (iData.GetDataPresent(DataFormats.Rtf))richTextBox1.Rtf = (string)iData.GetData(DataFormats.Rtf);else if (iData.GetDataPresent(DataFormats.Text))richTextBox1.Text = (string)iData.GetData(DataFormats.Text);elserichTextBox1.Text = "[Clipboard data is not RTF or ASCII Text]";}catch (Exception e){MessageBox.Show(e.ToString());}}/// <summary>/// 关闭程序,从观察链移除/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form2_FormClosed(object sender, FormClosedEventArgs e){ChangeClipboardChain(Handle, nextClipboardViewer);}#region WindowsAPI/// <summary>/// 将CWnd加入一个窗口链,每当剪贴板的内容发生变化时,就会通知这些窗口/// </summary>/// <param name="hWndNewViewer">句柄</param>/// <returns>返回剪贴板观察器链中下一个窗口的句柄</returns>[DllImport("User32.dll")]protected static extern int SetClipboardViewer(int hWndNewViewer);/// <summary>/// 从剪贴板链中移出的窗口句柄/// </summary>/// <param name="hWndRemove">从剪贴板链中移出的窗口句柄</param>/// <param name="hWndNewNext">hWndRemove的下一个在剪贴板链中的窗口句柄</param>/// <returns>如果成功,非零;否则为0。</returns>[DllImport("User32.dll", CharSet = CharSet.Auto)]public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);/// <summary>/// 将指定的消息发送到一个或多个窗口/// </summary>/// <param name="hwnd">其窗口程序将接收消息的窗口的句柄</param>/// <param name="wMsg">指定被发送的消息</param>/// <param name="wParam">指定附加的消息特定信息</param>/// <param name="lParam">指定附加的消息特定信息</param>/// <returns>消息处理的结果</returns>[DllImport("user32.dll", CharSet = CharSet.Auto)]public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);#endregion
}

认真看一下并不难理解,这种带通知的方式更方便操作。

##3、代码
另外代码打了个包(Form1是方案一,Form2是方案二)
下载

如果没有积分,可以关注公众号拿下载地址【大鱼code】
大鱼code

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图解Java中的18 把锁!

乐观锁和悲观锁独占锁和共享锁互斥锁和读写锁公平锁和非公平锁可重入锁自旋锁分段锁锁升级&#xff08;无锁|偏向锁|轻量级锁|重量级锁&#xff09;锁优化技术&#xff08;锁粗化、锁消除&#xff09;乐观锁和悲观锁悲观锁悲观锁对应于生活中悲观的人&#xff0c;悲观的人总是想…

在CSS中使用not:first-child选择器

Introduction: 介绍&#xff1a; Well, selectors are a very common term to deal with while we are developing a website or web page. You might know quite a few of them and might as well be implementing them. You might also have noticed that all the selectors…

linux/unix 段错误捕获【续】

本文为“在C/C中捕获段错误&#xff0c;打印出错的具体位置”的续篇&#xff0c;进一步解决涉及动态链接库的情况。背景知识&#xff1a;linux/unix下动态链接库的基本原理/proc/pid/maps文件的基本格式动态链接库&#xff1a;在进程执行过程中动态加载&#xff0c;进程间可以共…

C#获取屏幕大小的“简单整理”。。

额…… 首先是有一个需求&#xff0c;两个显示器&#xff0c;程序自动获取自己所在的显示器大小&#xff0c;并显示到右下角。 我们都知道C#有一个Screen.PrimaryScreen.Bounds&#xff0c;可以获取屏幕的完整尺寸&#xff0c;但是只能获取主显示器的尺寸&#xff0c;后来我发…

Spring为什么建议构造器注入?

来源 | juejin.cn/post/6844904056230690824作者 | Richard_Yi本文的内容主要是想探讨我们在进行 Spring 开发过程当中&#xff0c;关于依赖注入的几个知识点&#xff0c;具体内容如下&#xff1a;Autowired, Resource, Inject 三个注解的区别当你在使用Autowired时&#xff0…

c#中的long类型示例_C#中带示例的带符号字节数组

c#中的long类型示例C&#xff03;中的有符号字节数组 (Signed Byte Array in C#) In C#.Net, we can create a signed byte array by using sbyte, sbyte is used to store both of the values (negative and positive) between the range of -128 to 127 (Signed 8 bits integ…

Shell中的while循环

while循环的格式while expressiondocommandcommanddone1、计数器控制的while循环主要用于已经准确知道要输入的数据和字符串的数目。举例1 #!/bin/sh2 int13 while(( $int<5 ))4 do5 echo $int6 let "int"7 done2、结束标记控制的while循环主要用于不知道读入数据…

一文玩转 EhCache 缓存框架!

Ehcache 介绍EhCache 从 Hibernate 发展而来&#xff0c;是一个纯Java的进程内缓存框架&#xff0c;具有快速、精干等特点。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存&#xff0c;Java EE和轻量级容器。它具有内存和磁盘存储&#xff0c;缓存加载器&#x…

avr uart打印_AVR | 在16x2 LCD上打印HELLO WORLD

avr uart打印We would learn the connection to the LCD first as the connections is a bit complex and here we are using an 8-bit LCD. 我们将首先学习到LCD的连接&#xff0c;因为连接有点复杂&#xff0c;这里我们使用的是8位LCD 。 Simulation 模拟 Explanation 说明…

SQLite CodeFirst、Migration 的趟坑过程 [附源码]

负二、配置说明 最近想做个东西&#xff0c;用到了SQLite&#xff0c;按照之前的方法步骤搭建的结果失败了&#xff0c;因为SQLite的版本升级了&#xff0c;导致Migration自动迁移各种报错&#xff0c;而且我查了一下自动迁移的包貌是不再更新了。——2018年1月24日 能正常使用…

linux中lvm的缩减

问题提出&#xff1a;服务器硬盘做成了lvm&#xff0c;但是/home目录空间较大&#xff0c;于是想缩减一下&#xff0c;分配给其他目录。实验环境&#xff1a;操作系统&#xff1a;redhat企业版&#xff0c;硬盘已经做成了lvm。问题解决&#xff1a;操作前的注意事项&#xff1a…

SpringBoot 过滤器、拦截器、监听器对比及使用场景!

来源 | blog.csdn.net/qq_38020915/article/details/116431612作者 | dingwen_blog一、关系图理解二、区别1.过滤器过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁可以对请求的URL进行过滤, 对敏感词过滤挡在拦截器的外层实现的是 javax.servlet.Filter 接口…

Java StringBuilder length()方法与示例

StringBuilder类的length()方法 (StringBuilder Class length() method) length() method is available in java.lang package. length()方法在java.lang包中可用。 length() method is used to return the length of this sequence (i.e. it counts the number of characters …

进程通信:匿名管道和命名管道

一、进程间通信方式 管道( pipe )&#xff1a;管道是一种半双工的通信方式&#xff0c;数据只能单向流动&#xff0c;而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。有名管道 (named pipe) &#xff1a; 有名管道也是半双工的通信方式&#xff0c…

Jenkins Build Radiators(构建发射源)

为什么80%的码农都做不了架构师&#xff1f;>>> information radiators&#xff08;信息发射源&#xff09;的概念通常被用在敏捷的圈子里。 据敏捷专家Alistair Cockburn所说&#xff1a; 一个信息发射源是一个贴在一个地方的显示器&#xff0c;当人们工作或路过时…

线程池是如何重复利用空闲的线程来执行任务的?

来源&#xff1a;blog.csdn.net/anhenzhufeng/article/details/88870374在Java开发中&#xff0c;经常需要创建线程去执行一些任务&#xff0c;实现起来也非常方便&#xff0c;但如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c…

strictmath_Java StrictMath nextAfter()方法与示例

strictmathStrictMath类的nextAfter()方法 (StrictMath Class nextAfter() method) Syntax: 句法&#xff1a; public static double nextAfter(double starts , double directions);public static float nextAfter(float starts , double directions);nextAfter() method is …

C# 将程序添加开机启动的三种方式

前言 最近在研究程序随系统启动&#xff0c;发现在 win7 上因为权限的问题&#xff0c;写注册表的时候总是会出现问题&#xff0c;写不进去导致的不能自动启动&#xff0c;随后决定仔细的看一看这方面的问题。 查资料过程中主要发现有三种方式可以添加到启动&#xff0c;分别…

SpringBoot 中的 3 种条件装配!

一、介绍在实际的项目开发中&#xff0c;我们往往需要根据不同的环境做出不同的配置&#xff0c;例如&#xff1a;在开发环境下&#xff0c;我们会使用内存数据库以便快速启动服务并进行开发调试&#xff0c;在test环境、生产环境&#xff0c;会使用对应环境的数据库。如果我们…

java中intvalue_Java Short类intValue()方法及示例

java中intvalue短类intValue()方法 (Short class intValue() method) intValue() method is available in java.lang package. intValue()方法在java.lang包中可用。 intValue() method is used to return the value denoted by this Short object converted to type int (by c…