C#使用Clipboard類實(shí)現(xiàn)剪貼板功能
剪貼板是Windows操作系統(tǒng)中最常用的功能之一,它用來從一個(gè)應(yīng)用程序向另一個(gè)應(yīng)用程序傳遞數(shù)據(jù),可以是文本,圖象,甚至是程序?qū)ο蟆?/p>
不過剪貼板也有限制,它在某個(gè)特定的時(shí)間只能指向一塊內(nèi)容,每一個(gè)隨后復(fù)制的內(nèi)容都會(huì)取代先前的內(nèi)容。
為了在C#中操作剪貼板(包括內(nèi)容的讀取和寫入)需要使用到System.Windows.Forms.Clipboard類
一、向剪貼板中存放東西。相當(dāng)于Ctrl+C
主要用到Clipboard類的SetDataObject(Object obj,bool copy )方法,此方法是將目標(biāo)對(duì)象放入剪貼板中。
obj就是目標(biāo)對(duì)象,
參數(shù)copy表示是否在程序結(jié)束時(shí)仍然保存對(duì)象于剪貼板。如果設(shè)置為false,或者不設(shè)置,將在程序運(yùn)行結(jié)束后不保留剪切板內(nèi)容。
1、存放普通數(shù)據(jù)
Clipboard.SetDataObject(textBox1.Text);
通過以上代碼便完成了復(fù)制操作。你可以打開文本文檔,按下Ctrl+V 看一下效果。
2、往剪切板里存取自定義數(shù)據(jù)
C#的對(duì)象的數(shù)據(jù)結(jié)構(gòu)并不能為剪切板所理解,所以你要把你自定義的數(shù)據(jù)放到剪切板去的話要把它序列化,在實(shí)際操作中,是要你提供一個(gè)“可序列化”的對(duì)象。
注意:
- 對(duì)象必須是可序列化的(Serializable注解),才能將其放在剪貼板上。 如果將非序列化對(duì)象傳遞到剪貼板方法,則該方法將失敗,且不會(huì)引發(fā)異常。
- Clipboard 類只能在設(shè)置為單線程單元(STA)模式的線程中使用。 若要使用此類,請(qǐng)確保
Main方法使用 STAThreadAttribute 屬性進(jìn)行標(biāo)記。 - 如果數(shù)據(jù)比較復(fù)雜,可以考慮把數(shù)據(jù)自行序列化到一個(gè)Stream對(duì)象去,再把Stream對(duì)象寫入剪切板,獲取的時(shí)候?qū)tream對(duì)象自行反序列化,還原數(shù)據(jù)。
下面是個(gè)簡(jiǎn)單的例子:
[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);
}
}最后要注意的一點(diǎn)是由于這里的數(shù)據(jù)類型是“mydata”,你也可以指定別的名字,這種類型數(shù)據(jù)只有你自己的程序能讀懂,也就是說,你是不能打開記事本或者Photoshop,直接把你這個(gè)User對(duì)象貼上去的。
二、從剪貼板讀取東西。相當(dāng)于Ctrl+V
主要用到的方法為:GetDataObject()用來檢索剪貼板中的數(shù)據(jù),它返回的是任何格式的數(shù)據(jù),返回IDataObject接口,用來接收任何數(shù)據(jù)。
- IDataObject接口實(shí)例的 GetDataPresent (Type Format)方法返回bool值,獲取指定類型是否可用。
- 另外就是DataFormats類,該類主要是用來標(biāo)識(shí)格式用的。
- 從剪切板上獲得數(shù)據(jù)不影響剪貼板的內(nèi)容,GetData的返回值是存儲(chǔ)在剪貼板上的副本。
1、粘貼文本的方法:
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
//如果剪貼板中的數(shù)據(jù)是文本格式
this.label1.Text = (string)iData.GetData(DataFormats.Text);//檢索與指定格式相關(guān)聯(lián)的數(shù)據(jù)
}
else
{
MessageBox.Show("目前剪貼板中數(shù)據(jù)不可轉(zhuǎn)換為文本", "錯(cuò)誤");
}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("目前剪貼板中數(shù)據(jù)不可轉(zhuǎn)換為圖片", "錯(cuò)誤");
}3、控件自帶的paste方法
另外我們可以利用某些控件自帶的paste方法進(jìn)行粘貼操作,我們這里以richtextbox為例。[注:在使用控件的paste方法之前必須確??丶膔eadonly屬性為false,否則無法對(duì)控件進(jìn)行此操作!]
現(xiàn)在我們就用paste方法來實(shí)現(xiàn)向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))//判斷此控件是否可以粘貼這個(gè)格式的數(shù)據(jù)
{
richTextBox2.Paste(myFormat);
}
else
{
MessageBox.Show("無法粘貼!");
}
}到此這篇關(guān)于C#使用Clipboard類實(shí)現(xiàn)剪貼板功能的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#使用CefSharp實(shí)現(xiàn)內(nèi)嵌網(wǎng)頁詳解
這篇文章主要介紹了C# WPF里怎么使用CefSharp嵌入一個(gè)網(wǎng)頁,并給出一個(gè)簡(jiǎn)單示例演示C#和網(wǎng)頁(JS)的交互實(shí)現(xiàn),感興趣的小伙伴可以了解一下2023-04-04
C#切換鼠標(biāo)左右鍵習(xí)慣無需控制面板中修改
本人一直喜歡左手使用鼠標(biāo),偶爾同事會(huì)臨時(shí)操作一下,因?yàn)樗牧?xí)慣是右手,還得在控制面板里進(jìn)行更改,太麻煩了所以就編寫一個(gè)控制臺(tái)程序,雙擊一下即可切換左右鍵,熱愛懶人的你可不要錯(cuò)過了哈2013-02-02
C#自動(dòng)創(chuàng)建數(shù)據(jù)庫實(shí)現(xiàn)代碼
C#下創(chuàng)建數(shù)據(jù)庫的代碼2008-03-03
C#/.Net 中快速批量給SQLite數(shù)據(jù)庫插入測(cè)試數(shù)據(jù)
這篇文章主要介紹了C#/.Net 中快速批量給SQLite數(shù)據(jù)庫插入測(cè)試數(shù)據(jù),本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-06-06

