C#定义了一个类System.Windows.Forms.Clipboard来简化剪切板操作,这个类有一个静态方法,主要有:

Clear 清除剪切板中的所有数据;
ContainsData,ContainsAudio,ContainsFlieDropList,ContainsText,ContainsImage,用于检查剪切板中是否存在相应的数据;
GetAudioStream,GetDataObject,GetText,GetImage,GetFileDropList,用于取得数据;
SetAudio,SetDataObject,SetText,SetImage,SetFileDropList,用于添加数据;

以下是检测剪切板的方法:

一、引入

要使用剪切板首先要引入三个函数,
        [System.Runtime.InteropServices.DllImport("user32")]
        private static extern IntPtr SetClipboardViewer(IntPtr hwnd);
        [System.Runtime.InteropServices.DllImport("user32")]
        private static extern IntPtr ChangeClipboardChain(IntPtr hwnd,IntPtr hWndNext);
        [System.Runtime.InteropServices.DllImport("user32")]
        private static extern int SendMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam);

const int WM_DRAWCLIPBOARD = 0x308;
        const int WM_CHANGECBCHAIN = 0x30D;

IntPtr SetClipboardViewer(IntPtr hwnd) 用于往观察链中添加一个窗口句柄,这个窗口就可成为观察链中的一员了,返回值指向下一个观察者。
IntPtr ChangeClipboardChain(IntPtr hwnd,IntPtr hWndNext); 删除由hwnd指定的观察链成员,这是一个窗口句柄,第二个参数hWndNext是观察链中下一个窗口的句柄
int SendMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam); 发送消息

二、使用
定义完成之后,可以分三部来使用,第一步把自己的窗口添加到观察链中成为观察者,并保存下一个观察者的句柄;第二步监视剪切板,并把剪切板变化的消息发送给下一个观察者;第三步撤消自己定义的观察者,并通知下一个观察者。

第一步:把自己的窗口添加到观察链中成为观察者,并保存下一个观察者的句柄;
//存放观察链中下一个窗口句柄    
IntPtr NextClipHwnd;

private void Form1_Load(object sender, System.EventArgs e)
{   
     //获得观察链中下一个窗口句柄
    NextClipHwnd=SetClipboardViewer(this.Handle);            
 }

第二步:监视剪切板,并把剪切板变化的消息发送给下一个观察者,这里需要重载WndProc方法;
这里用到两个消息常量:
  const int WM_DRAWCLIPBOARD = 0x308;
  const int WM_CHANGECBCHAIN = 0x30D;

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    switch(m.Msg)
    {
        case WM_DRAWCLIPBOARD:
            //将WM_DRAWCLIPBOARD消息传递到下一个观察链中的窗口
            SendMessage(NextClipHwnd,m.Msg,m.WParam,m.LParam);
            IDataObject iData = Clipboard.GetDataObject();  
              //检测文本
            if(iData.GetDataPresent(DataFormats.Text)|iData.GetDataPresent(DataFormats.OemText)) 
            {
                     this.richTextBox1.Text=(String)iData.GetData(DataFormats.Text); 
            }
             //检测图像
             if (iData.GetDataPresent(DataFormats.Bitmap))
              {
                        pictureBox1.Image=Clipboard.GetImage();
                        NewClipData();
              }
              //检测自定义类型
               if (iData.GetDataPresent("myFormat"))
                {
                        MyObj myobj=(MyObj)iData.GetData("myFormat");
                        this.richTextBox1.Text=myobj.ObjName;
                }
              break;
        default:
            base.WndProc(ref m);
            break;
    }        
}

第三步:撤消自己定义的观察者,并通知下一个观察者。
private void Form1_Closed(object sender, System.EventArgs e)
{
            //从观察链中删除本观察窗口(第一个参数:将要删除的窗口的句柄;第二个参数://观察链中下一个窗口的句柄 )
           ChangeClipboardChain(this.Handle,NextClipHwnd);
            //将变动消息WM_CHANGECBCHAIN消息传递到下一个观察链中的窗口 
            SendMessage(NextClipHwnd,WM_CHANGECBCHAIN,this.Handle,NextClipHwnd);  
}

三、扩展
DataFormats类定义了剪切板内容的几种格式,包括Text,UnicodeText,OemText,Rtf,Html,Dib,Bitmap等,但自己可以定义新的数据格式,代码如下 :
    //新类
    public class MyObj
    {
        private string objName;
        public MyObj()
        {
            objName = "自定义剪切板内容";
        }
        public string ObjName
        {
            get { return objName; }
        }
    }

//往剪切板中添加一个自定义内容
        private void NewClipData()
        {
            DataFormats.Format myFormat = DataFormats.GetFormat("myFormat");
            MyObj myobj = new MyObj();
            DataObject myDataObject = new DataObject("myFormat", myobj);
            Clipboard.SetDataObject(myDataObject);
        }
其中myFormat就是自定义数据格式的名称,
在上面的WinProc中可以看到
             //检测图像
             if (iData.GetDataPresent(DataFormats.Bitmap))
              {
                        pictureBox1.Image=Clipboard.GetImage();
                        NewClipData();
              }

检测到剪切板中有图像内容时,就显示这个图像,然后,调用NewClipData(),产生一个新剪切板数据,其格式是自定义的myFormat,这时,程序会通过下面这段代码来检测到这个变化,并处理
              //检测自定义类型
               if (iData.GetDataPresent("myFormat"))
                {
                        MyObj myobj=(MyObj)iData.GetData("myFormat");
                        this.richTextBox1.Text=myobj.ObjName;
                }

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/waxic/archive/2006/10/08/1326234.aspx

转载于:https://www.cnblogs.com/hehexiaoxia/archive/2012/10/26/2741349.html

[转载]C# 剪切板编程 Clipboard相关推荐

  1. android 剪切板软件,Clipboard Actions剪切板

    Clipboard Actions剪切板,强大的剪贴板工具,支持快速分享复制内容,保存多个复制记录,方便手机使用,快来下载吧 Clipboard Actions剪切板功能 剪贴板操作将基于剪贴板的行动 ...

  2. 兼容手机PC,点击即可复制文本内容到剪切板插件clipboard.js

    开源项目 https://github.com/zenorocha/clipboard.js. (拷贝文本到剪切板不应该复杂,它不应该需要许多步骤以及几百KB的文件,另外,它不应该依靠flash以及其 ...

  3. C# 使用WinApi操作剪切板Clipboard

    前言: 最近正好写一个程序,需要操作剪切板 功能很简单,只需要从剪切板内读取字符串,然后清空剪切板,然后再把字符串导入剪切板 我想当然的使用我最拿手的C#来完成这项工作,原因无他,因为.Net框架封装 ...

  4. PyQt5 技术篇-在clipboard.dataChanged.connect()里如何写入剪切板示例演示,pyqt5监听剪切板变动并写入剪切板内容

    PyQt5 自带的写入剪切板方法在 clipboard.dataChanged.connect() 里不生效,主要是为了避免死循环. 不过利用其它的写入剪切板方法放在里面就不会有影响了,比如 pype ...

  5. Python 技术篇-利用pyqt5库监听剪切板变动,clipboard.dataChanged.connect()剪切板监听

    PyQt5 的 clipboard.dataChanged.connect() 方法可以监听剪切板的变动. from PyQt5.QtWidgets import *app = QApplicatio ...

  6. Navigator.clipboard剪切板 API 可用于实现剪切、复制、粘贴的功能。

    剪贴板 Clipboard API 为 Navigator 接口添加了只读属性 clipboard,该属性返回一个可以读写剪切板内容的 Clipboard 对象. 在 Web 应用中,剪切板 API ...

  7. vim 寄存器,剪切板

    为什么80%的码农都做不了架构师?>>> 在vim里面写原创文章,或者转帖自己看到的经典文章: 在vim里面写好之后,排好版,然后,快捷键操作:gg, shift+V, shift ...

  8. Java剪切板操作大全

    转载自   Java剪切板操作大全 1. 概述 提起剪切板,一般都是在桌面系统或工具中使用.目前,操作Java剪切板有两种形式,这也对应着两种不同的技术Swing和JavaFX. 而剪切板有可以分为系 ...

  9. Java 技术篇-利用ClipboardOwner实现实时监听剪切板功能实例演示

    核心功能说明: 设置剪切板内容并指定所有者:clipboard.setContents(); 当所有者为程序本身时才能监听到剪切板的变动,每次系统执行复制或剪切动作时会自动的更改剪切板的所有者,所以每 ...

最新文章

  1. tomcat端口占用后的解决办法
  2. 没有CLOB类型却报ORA-00932: 数据类型不一致: 应为 -, 但却获得 CLOB
  3. 换64位Win7了,感觉还行
  4. Eclipse——UML类图插件
  5. SPOJ 220 Relevant Phrases of Annihilation(后缀数组+二分答案)
  6. 【codevs3732】【BZOJ3751】解方程,hash+秦九韶算法
  7. xshell 端口转发
  8. Oracle 动态视图3 V$SESSION
  9. oracle表内连接和外连接
  10. StretchDIBits函数显示图片
  11. 邱锡鹏nndl学习记录
  12. android 仿小米便签,高仿小米便签
  13. ShuffleNet原理
  14. 【Mac OS 与 Win10/Win7 双系统忘记Windows开机密码】苹果电脑安装了双系统,忘记了Windows开机密码
  15. 微商公社新兵连第四天
  16. lorawan 科普文
  17. iOS 15 适配总结
  18. 6-1 Person类
  19. 推荐系统的混合加权技术研究
  20. zynq 黑金 linux 教程,【黑金ZYNQ7000系列原创视频教程】05.FPGA和ARM的初次结合——LED实验...

热门文章

  1. Python Windows文件操作
  2. C语言中调用可执行程序的方法。
  3. VCIX-NV学习指南
  4. VMware产品演示网站
  5. Java基础学习总结(169)——ThreadLocal 使用总结
  6. Docker学习总结(17)——学会使用Dockerfile
  7. 阿里巴巴开源技术汇总:115个软件(二)
  8. mac bash file密码_MAC 常用命令汇总
  9. Apache与Tomcat的区别
  10. Linux Fedora8 下安装 IE6