首頁 > 軟體

C#使用Clipboard類實現剪貼簿功能

2022-06-15 10:00:14

剪貼簿是Windows作業系統中最常用的功能之一,它用來從一個應用程式向另一個應用程式傳遞資料,可以是文字,圖象,甚至是程式物件。

不過剪貼簿也有限制,它在某個特定的時間只能指向一塊內容,每一個隨後複製的內容都會取代先前的內容。

為了在C#中操作剪貼簿(包括內容的讀取和寫入)需要使用到System.Windows.Forms.Clipboard類

一、向剪貼簿中存放東西。相當於Ctrl+C

主要用到Clipboard類的SetDataObject(Object obj,bool copy )方法,此方法是將目標物件放入剪貼簿中。

obj就是目標物件,

引數copy表示是否在程式結束時仍然儲存物件於剪貼簿。如果設定為false,或者不設定,將在程式執行結束後不保留剪下板內容。

1、存放普通資料

Clipboard.SetDataObject(textBox1.Text);

通過以上程式碼便完成了複製操作。你可以開啟文字檔案,按下Ctrl+V 看一下效果。

2、往剪下板裡存取自定義資料

C#的物件的資料結構並不能為剪下板所理解,所以你要把你自定義的資料放到剪下板去的話要把它序列化,在實際操作中,是要你提供一個“可序列化”的物件。 
注意:

  • 物件必須是可序列化的(Serializable註解),才能將其放在剪貼簿上。 如果將非序列化物件傳遞到剪貼簿方法,則該方法將失敗,且不會引發異常。
  • Clipboard 類只能在設定為單執行緒單元(STA)模式的執行緒中使用。 若要使用此類,請確保 Main 方法使用 STAThreadAttribute 屬性進行標記。
  • 如果資料比較複雜,可以考慮把資料自行序列化到一個Stream物件去,再把Stream物件寫入剪下板,獲取的時候對Stream物件自行反序列化,還原資料。

下面是個簡單的例子:

[Serializable]
public class User {
    public int age { get; set; }
    public string name { get; set; }
}

class Program {
    [STAThread]
    static void Main(string[] args) {
        User userIn = new User();
        userIn.name = "Jack";
        userIn.age = 18;
        Clipboard.SetData("mydata", userIn);
        User userOut = (User)Clipboard.GetData("mydata");
        Console.WriteLine(userOut.name +" | " + userOut.age);
    }
}

最後要注意的一點是由於這裡的資料型別是“mydata”,你也可以指定別的名字,這種型別資料只有你自己的程式能讀懂,也就是說,你是不能開啟記事本或者Photoshop,直接把你這個User物件貼上去的。

二、從剪貼簿讀取東西。相當於Ctrl+V

主要用到的方法為:GetDataObject()用來檢索剪貼簿中的資料,它返回的是任何格式的資料,返回IDataObject介面,用來接收任何資料。

  • IDataObject介面範例的 GetDataPresent (Type Format)方法返回bool值,獲取指定型別是否可用。
  • 另外就是DataFormats類,該類主要是用來標識格式用的。
  • 從剪下板上獲得資料不影響剪貼簿的內容,GetData的返回值是儲存在剪貼簿上的副本。

1、貼上文字的方法:

IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
    //如果剪貼簿中的資料是文字格式 
    this.label1.Text = (string)iData.GetData(DataFormats.Text);//檢索與指定格式相關聯的資料 
}
else
{
    MessageBox.Show("目前剪貼簿中資料不可轉換為文字", "錯誤");
}

2、貼上圖片:

if (Clipboard.ContainsImage())
 {
     Image img = Clipboard.GetImage();
     pictureBox1.Image = img;
 }

或者

IDataObject iData = Clipboard.GetDataObject();
 if (iData.GetDataPresent(DataFormats.Bitmap))
 {
     this.pictureBox1.Image = (Bitmap)iData.GetData(DataFormats.Bitmap);
 }
 else
 {
     MessageBox.Show("目前剪貼簿中資料不可轉換為圖片", "錯誤");
 }

3、控制元件自帶的paste方法

另外我們可以利用某些控制元件自帶的paste方法進行貼上操作,我們這裡以richtextbox為例。[注:在使用控制元件的paste方法之前必須確保控制元件的readonly屬性為false,否則無法對控制元件進行此操作!]

現在我們就用paste方法來實現向richtextbox中加入圖片。

OpenFileDialog fd = new OpenFileDialog();
fd.Filter = "圖片檔案|*.jpg|所有檔案|*.*";
if (fd.ShowDialog() == DialogResult.OK)
{
    Clipboard.SetDataObject(Image.FromFile(fd.FileName), true);
    DataFormats.Format myFormat = DataFormats.GetFormat(DataFormats.Bitmap);
    richTextBox2.ReadOnly = false;
    if (richTextBox2.CanPaste(myFormat))//判斷此控制元件是否可以貼上這個格式的資料 
    {
        richTextBox2.Paste(myFormat);
    }
    else
    {
        MessageBox.Show("無法貼上!");
    }
}

到此這篇關於C#使用Clipboard類實現剪貼簿功能的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com