Visual C# 2005剪貼板的數(shù)據擷取與存入

2010-08-28 10:50:09來源:西部e網作者:

有許多應用程序都會使用剪貼板(Clipboard)作為數(shù)據的暫存處,而此項需求通常與用戶的操作相關聯(lián)。舉例來說,當我們在文字處理軟件中進行剪切、復制與粘貼等操作時就會使用到剪貼板。由此可知,學會如何將數(shù)據存入剪貼板以及如何從剪貼板擷取數(shù)據便成為一項非常重要的課題。

將數(shù)據存入剪貼板要在Windows應用程序中將數(shù)據存入剪貼板必須分兩方面來討論:用戶操作與程序控制方式。所謂的用戶操作就是當用戶進行復制或剪切操作時,會將數(shù)據存入剪貼板中。所謂程序控制方式就是如何通過程序代碼將數(shù)據存入剪貼板中,顯然此作法才是值得我們討論的。

要以程控方式將數(shù)據存入剪貼板中,應該通過Clipboard類的SetDataObject方法來完成。SetDataObject方法會使用IDataObject接口將數(shù)據以“多重格式”保存在剪貼板中,而此舉最大的好處是,以后可以采用各種不同的格式從剪貼板中擷取數(shù)據。畢竟當我們將數(shù)據存入剪貼板時,可能無法確定未來會采用哪一種格式從剪貼板中擷取數(shù)據,為了提高從剪貼板擷取數(shù)據的機會,以多重格式將數(shù)據保存在剪貼板中是非常恰當?shù)淖龇ā?BR>
SetDataObject方法共提供如圖8.3所示的3個重載版本。語法中的data參數(shù)即是您要存入剪貼板中的數(shù)據,第二個參數(shù)copy用來決定在結束應用程序之后是否要保留剪貼板中的數(shù)據。如果您沒有指定第二個參數(shù)或是將第二個參數(shù)設定成False,則當應用程序結束時,數(shù)據會從剪貼板中刪除;如果您將第二個參數(shù)設定成True,則當應用程序結束時,數(shù)據仍然會保留在剪貼板中。

值得注意的是,如果剪貼板忙于運行其他進程或應用程序,則嘗試將數(shù)據加入到剪貼板時有可能會失敗。如果要在經常使用剪貼板的環(huán)境中解決這個問題,第三個重載版本的SetDataObject方法就顯得非常有用。您可以使用第3個參數(shù)retryTimes來設定嘗試將數(shù)據放置于剪貼板上的次數(shù),并使用第4個參數(shù)retryDelay來設定在每一次嘗試之間暫停的毫秒數(shù)。

以下面的簡例而言,表示將名稱為TextBox1的TextBox控件中的數(shù)據存入剪貼板中:

Clipboard.SetDataObject(TextBox1.Text);

事情就這樣結束了嗎?當然還沒有。上面這一個簡例其實是一種非常簡單的情況,因為位于TextBox控件中的數(shù)據是由用戶所輸入的。然而,您可曾想過一個問題,假設我希望將某一個圖片文件(.bmp、.jpg或.gif)的圖像數(shù)據存入剪貼板,或是希望將某一個文字文件中的文字數(shù)據存入剪貼板的話,該怎么做呢?諸如此類情況,還必須借助于DataObject類才能順利取得要存入剪貼板中的數(shù)據,并將其作為SetDataObject方法的data參數(shù)。

DataObject類實現(xiàn)IDataObject接口,它的各種方法提供了不受格式影響的數(shù)據傳輸機制。DataObject主要是使用于剪貼板和拖放操作的相關處理中。DataObject類提供IDataObject接口的建議實現(xiàn),也就是說,您應該使用DataObject而不要自己去實現(xiàn)IDataObject。

您可以將不同格式的多項數(shù)據存儲在DataObject對象中。這樣做的最大好處是,以后可以采用各種不同的格式從DataObject中擷取數(shù)據。畢竟當我們將數(shù)據存入DataObject對象時,可能無法確定未來會采用哪一種格式從DataObject對象中擷取數(shù)據,為了提高從DataObject對象擷取數(shù)據的機會,以多重格式將數(shù)據存儲在DataObject對象中是最恰當?shù)淖龇ā?BR>
如果您要將數(shù)據存儲在DataObject對象中,請將數(shù)據傳遞給DataObject的構造函數(shù)(Constructor)或是在創(chuàng)建DataObject對象之后再調用其SetData方法。要想從DataObject對象中以特定格式擷取數(shù)據,請調用DataObject對象的GetData方法。

稍后的程序范例將會示范如何使用DataObject對象,請稍安勿躁。

從剪貼板擷取數(shù)據如果您要從剪貼板中擷取數(shù)據,請依下列步驟進行:

1.首先,請調用Clipboard類的GetDataObject方法。GetDataObject方法會將剪貼板中的數(shù)據以一個實現(xiàn)IDataObject接口的對象返回。例如:

IDataObject data = Clipboard.GetDataObject();

2.接下來,請調用被GetDataObject方法返回的對象(也就是實現(xiàn)IDataObject接口的對象)的GetDataPresent方法,以便檢測數(shù)據是否含有您所需的格式。

3.如果GetDataPresent方法返回True表示存在您所需的格式,最后的工作就是調用被返回對象的GetData方法,以便以指定的格式取得數(shù)據。例如:

if (data.GetDataPresent(DataFormats.Text))
{
TextBox1.Text = data.GetData(DataFormats.Text).ToString();
}

\

圖8.4CH8_DemoForm005.cs運行畫面

程序范例1

圖8.4所示是程序范例CH8_DemoForm005.cs的運行畫面,它示范如何使用DataObject與Clipboard類將圖形文件中的圖像數(shù)據復制到剪貼板,然后再將剪貼板中的圖像數(shù)據復制到文件中。完成本程序的執(zhí)行操作后,剪貼板中的圖像數(shù)據會分別被復制到C磁盤的Test.bmp、Test.gif與Test.jpeg等3個圖形文件中。

相關程序代碼如下所示:
privatevoid btnCopyImageToClipboard_Click(

object sender, EventArgs e)

{

try

{

// 創(chuàng)建一個 DataObject 對象。
DataObject myDataObject
=new DataObject();



// 將項目的圖像資源存入 DataObject 對象中,

// 并設定圖像數(shù)據可以被轉換成其他格式。
myDataObject.SetData(

DataFormats.Bitmap,
true,

Resources.章立民的大頭照);



// 將持有圖形文件的圖像數(shù)據的 DataObject 對象

// 存入剪貼板中。
Clipboard.SetDataObject(myDataObject,
true);

btnSaveClipboardToFile.Enabled
=true;

}

...

}



// 將剪貼板中的圖像數(shù)據復制到文件中。privatevoid btnSaveClipboardToFile_Click(

object sender, EventArgs e)

{

try

{

// 將剪貼板中的數(shù)據以一個實現(xiàn) IDataObject接口的對象返回。
IDataObject oDataObj
= Clipboard.GetDataObject();



if (oDataObj !=null)

{

// 檢測從剪貼板所返回的數(shù)據是否存在Windows位圖的格式。if (oDataObj.GetDataPresent(DataFormats.Bitmap))

{

// 以Windows位圖格式取得影像數(shù)據。
System.Drawing.Image oImgObj
=

(Image)(oDataObj.GetData(

DataFormats.Bitmap,
true));



// 存儲成Bitmap。
oImgObj.Save(
@"C:\Test.bmp",

System.Drawing.Imaging.ImageFormat.Bmp);



// 存儲成JPEG。
oImgObj.Save(
@"C:\Test.jpeg"

System.Drawing.Imaging.ImageFormat.Jpeg);



// 存儲成GIF。
oImgObj.Save(
@"C:\Test.gif",

System.Drawing.Imaging.ImageFormat.Gif);

}

}

Process.Start(
"explorer.exe", @"C:\");

}

...

}


程序范例2
程序范例CH8_DemoForm006.cs詳細示范如何以各種格式將數(shù)據存入剪貼板并且從剪貼板中以特定格式擷取數(shù)據。首先,我們來查看其功能特性:
  • 您可以將文本字符串“From Microsoft Community!”以特定的格式或所有的格式(即多重格式)復制到剪貼板中,然后再以特定格式從剪貼板中擷取出來并貼入RichTextBox或TextBox控件中。
    以圖8.5所示的操作而言,我們將文本字符串“From Microsoft Community!”以所有的格式(即多重格式)復制到剪貼板中,然后以Rich TextFormat從剪貼板中擷取出來。請注意,由于我們以多重格式將數(shù)據存入剪貼板,因此在“粘貼為”的子菜單項目中會列出剪貼板中所有可用的格式。
    以圖8.6所示的操作而言,我們將文本字符串“From Microsoft Community!”以HTM格式復制到剪貼板中,然后以HTML格式從剪貼板中擷取出來。請注意,由于我們以單一格式將數(shù)據存入剪貼板,因此在“粘貼為”的子菜單項目中只會列出一種格式。

    \

    圖8.5將文本字符串以所有格式進行復制,以Rich Text格式擷取

    \

    圖8.6將文本字符串以HTM格式進行

    關鍵詞:VS.NET