C# 剪切板

//将非持久性数据置于系统剪贴板中。

Clipboard.SetDataObject("这条信息置于剪切板中,相当于Ctrl+C");

//获取剪切板中文本格式的内容,相当于Ctrl+V(不过如果剪切板中的内容不是文本格式就返回空字符串)

string message = Convert.ToString(Clipboard.GetDataObject().GetData(DataFormats.Text));

System.Windows.Forms 命名空间

Clipboard 类

Clipboard 成员

提供将数据置于系统剪贴板中以及从中检索数据的方法。无法继承此类。

方法
   名称                  说明
   Clear                 从剪贴板中移除所有数据。
   ContainsAudio         指示在剪贴板中是否存在 WaveAudio 格式的数据。
   ContainsData          指示剪贴板中是否存在指定格式的数据,或可转换成此格式的数据。
   ContainsFileDropList 指示剪贴板中是否存在 FileDrop 格式或可转换成此格式的数据。
   ContainsImage         指示剪贴板中是否存在 Bitmap 格式或可转换成此格式的数据。
   ContainsText          已重载。 指示剪贴板中是否存在文本数据。
   Equals                确定指定的 Object 是否等于当前的 Object。 (继承自 Object。)
   Finalize              允许 Object 在“垃圾回收”回收 Object 之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
   GetAudioStream        检索剪贴板上的音频流。
   GetData               从剪贴板中检索指定格式的数据。
   GetDataObject         检索当前位于系统剪贴板中的数据。
   GetFileDropList       从剪贴板中检索文件名的集合。
   GetHashCode           用作特定类型的哈希函数。 (继承自 Object。)
   GetImage              检索剪贴板上的图像。
   GetText               已重载。 从剪贴板中检索文本数据。
   GetType               获取当前实例的 Type。 (继承自 Object。)
   MemberwiseClone       创建当前 Object 的浅表副本。 (继承自 Object。)
   SetAudio              已重载。 将 WaveAudio 格式的数据添加到剪贴板中。
   SetData               将指定格式的数据添加到剪贴板中。
   SetDataObject         已重载。 将数据置于系统剪贴板中。
   SetFileDropList       将 FileDrop 格式的文件名集合添加到剪贴板中。
   SetImage              将 Bitmap 格式的 Image 添加到剪贴板中。
   SetText               已重载。 将文本数据添加到剪贴板中。
   ToString              返回表示当前 Object 的 String。 (继承自 Object。)

 

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值