C#中的剪下板編程

來源:互聯網
上載者:User

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;
                }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.