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是方案二)
下载

关于C#监视剪贴板信息相关推荐

  1. 跟我一起玩Win32开发(25):监视剪贴板

    跟我一起玩Win32开发(25):监视剪贴板 自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种"门前冷落鞍马稀"的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用 ...

  2. java监听剪贴板_Eclipse RCP应用中监视剪贴板变化的小技巧

    最近在做的一个基于Eclipse RCP的下载工具,需要监视系统剪贴板中. 自己在实现的时候主要遇到了两个问题: 1.如果监视线程使用非UI线程,则不能去访问剪贴板 2.如果监视线程使用UI线程,则该 ...

  3. delphi 剪切板变量_delphi剪切板-监视剪贴板

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  4. java代码获取gc信息,如何监视Java垃圾回收

    在文章<理解Java垃圾收集>中,我们了解了不同GC算法的流程,GC的工作方式,年轻代和年老代,以及您应该了解的新JDK 7中5种类型的GC的知识.这些类型的GC对性能都有影响. 本文将讨 ...

  5. 《Windows核心编程》---剪贴板

    剪贴板是由系统定义的,并不属于任何一个特定的进程.系统中所有进程都可以访问和设置剪贴板.剪贴板最大的特点就是数据传输没有明确的目标,数据是被动访问的:剪贴板的内容可以被多次访问,直到新的数据写入.剪贴 ...

  6. 闲来无事,说说Windows剪贴板 -- 剪贴板概述部分

    <小fisher首发office精英俱乐部-http://www.officefans.net/cdb/,转载请注明出处> 首先,讨论一下剪贴板是什么 Windows的帮助文件中对剪贴板的 ...

  7. Chrome浏览器新功能 剪贴板多平台共享

    chrome谷歌浏览器新功能 剪贴板多平台共享 根据softpedia报道,Chrome添加了一个新功能,不管浏览器运行在哪个平台上,允许用户在一个设备上复制内容,并将其粘贴到另一个设备上. 这个功能 ...

  8. SQL Server统计信息以及如何在SQL中执行更新统计信息

    This article gives a walk-through of SQL Server Statistics and different methods to perform SQL Serv ...

  9. iPaste:剪贴板界的一股清流

    iPaste,一款简约专注的剪贴板工具. 先前,iPaste 只活跃于 Mac 电脑中: 现在,我把它带到了 iPhone 手机上. 0) 缘起:我为什么要做 iPaste for iOS? 2017 ...

最新文章

  1. 高斯过程及其家族往事
  2. LISP 圆孔标记_lisp使用说明
  3. CentOS6.8下使用yum安装mysql,并远程登陆mysql
  4. OpenCV拼接细节stitching detailed的实例(附完整代码)
  5. 题解 UVA10587 【Mayor's posters】
  6. 微软宣布 Windows 10X:用于可折叠 PC 的新操作系统
  7. mysql not regexp_mysql 正则表达式 regexp rlike not rlike
  8. 基于嵌入式linux电子相册代码,基于嵌入式ARM_Linux的电子相册设计方案.docx
  9. cad卸载工具_使用感极好的5款软件分享,款款高逼格,下载之后就没舍得卸载...
  10. 阿里云DataV—多字段取满足某一个字段的行,多字段取不满足某一个字段的行(3)
  11. 紫川猜想--第二十二卷第六章
  12. django完成一个可重用注册登录系统
  13. 理解echo openssl概念、用法、常用参数
  14. Convert Kilometers to Miles 2010.3.6
  15. ACL 2021 | 基于词依存信息类型映射记忆神经网络的关系抽取
  16. C语言数据结构【手抄版】第五章 树和二叉树【上篇】
  17. 软件设计师——信息安全知识
  18. 使用简单的逻辑方法进行独立思考
  19. 展讯功能机平台MMK消息流转
  20. Excel公式中的countif 和 conutifs 和sumproduct

热门文章

  1. 1-docker 介绍
  2. Spring定时器的运用
  3. 联合使用 HTML 5、地理定位 API
  4. OpenCart 之 CSV 格式商品导入 – 如何导入商品主图片和附加图片?
  5. Oracle SQL语句执行步骤
  6. 安卓 java中改布局_android-选项卡布局中的地图视图throwing,java....
  7. Angular CLI 安装
  8. 如何请教问题且以后都会回答你的方法
  9. python单词反转_python文本 字符串逐字符反转以及逐单词反转
  10. opencv android jni,OpenCV - AndroidStudio的JNI工程及引用OpenCV