Visual C# 2005剪贴板的数据撷取与存入

2010-08-28 10:50:09来源:西部e网作者:

有许多应用程序都会使用剪贴板(Clipboard)作为数据的暂存处,而此项需求通常与用户的操作相关联。举例来说,当我们在文字处理软件中进行剪切、复制与粘贴等操作时就会使用到剪贴板。由此可知,学会如何将数据存入剪贴板以及如何从剪贴板撷取数据便成为一项非常重要的课题。

将数据存入剪贴板要在Windows应用程序中将数据存入剪贴板必须分两方面来讨论:用户操作与程序控制方式。所谓的用户操作就是当用户进行复制或剪切操作时,会将数据存入剪贴板中。所谓程序控制方式就是如何通过程序代码将数据存入剪贴板中,显然此作法才是值得我们讨论的。

要以程控方式将数据存入剪贴板中,应该通过Clipboard类的SetDataObject方法来完成。SetDataObject方法会使用IDataObject接口将数据以“多重格式”保存在剪贴板中,而此举最大的好处是,以后可以采用各种不同的格式从剪贴板中撷取数据。毕竟当我们将数据存入剪贴板时,可能无法确定未来会采用哪一种格式从剪贴板中撷取数据,为了提高从剪贴板撷取数据的机会,以多重格式将数据保存在剪贴板中是非常恰当的做法。

SetDataObject方法共提供如图8.3所示的3个重载版本。语法中的data参数即是您要存入剪贴板中的数据,第二个参数copy用来决定在结束应用程序之后是否要保留剪贴板中的数据。如果您没有指定第二个参数或是将第二个参数设定成False,则当应用程序结束时,数据会从剪贴板中删除;如果您将第二个参数设定成True,则当应用程序结束时,数据仍然会保留在剪贴板中。

值得注意的是,如果剪贴板忙于运行其他进程或应用程序,则尝试将数据加入到剪贴板时有可能会失败。如果要在经常使用剪贴板的环境中解决这个问题,第三个重载版本的SetDataObject方法就显得非常有用。您可以使用第3个参数retryTimes来设定尝试将数据放置于剪贴板上的次数,并使用第4个参数retryDelay来设定在每一次尝试之间暂停的毫秒数。

以下面的简例而言,表示将名称为TextBox1的TextBox控件中的数据存入剪贴板中:

Clipboard.SetDataObject(TextBox1.Text);

事情就这样结束了吗?当然还没有。上面这一个简例其实是一种非常简单的情况,因为位于TextBox控件中的数据是由用户所输入的。然而,您可曾想过一个问题,假设我希望将某一个图片文件(.bmp、.jpg或.gif)的图像数据存入剪贴板,或是希望将某一个文字文件中的文字数据存入剪贴板的话,该怎么做呢?诸如此类情况,还必须借助于DataObject类才能顺利取得要存入剪贴板中的数据,并将其作为SetDataObject方法的data参数。

DataObject类实现IDataObject接口,它的各种方法提供了不受格式影响的数据传输机制。DataObject主要是使用于剪贴板和拖放操作的相关处理中。DataObject类提供IDataObject接口的建议实现,也就是说,您应该使用DataObject而不要自己去实现IDataObject。

您可以将不同格式的多项数据存储在DataObject对象中。这样做的最大好处是,以后可以采用各种不同的格式从DataObject中撷取数据。毕竟当我们将数据存入DataObject对象时,可能无法确定未来会采用哪一种格式从DataObject对象中撷取数据,为了提高从DataObject对象撷取数据的机会,以多重格式将数据存储在DataObject对象中是最恰当的做法。

如果您要将数据存储在DataObject对象中,请将数据传递给DataObject的构造函数(Constructor)或是在创建DataObject对象之后再调用其SetData方法。要想从DataObject对象中以特定格式撷取数据,请调用DataObject对象的GetData方法。

稍后的程序范例将会示范如何使用DataObject对象,请稍安勿躁。

从剪贴板撷取数据如果您要从剪贴板中撷取数据,请依下列步骤进行:

1.首先,请调用Clipboard类的GetDataObject方法。GetDataObject方法会将剪贴板中的数据以一个实现IDataObject接口的对象返回。例如:

IDataObject data = Clipboard.GetDataObject();

2.接下来,请调用被GetDataObject方法返回的对象(也就是实现IDataObject接口的对象)的GetDataPresent方法,以便检测数据是否含有您所需的格式。

3.如果GetDataPresent方法返回True表示存在您所需的格式,最后的工作就是调用被返回对象的GetData方法,以便以指定的格式取得数据。例如:

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

\

图8.4CH8_DemoForm005.cs运行画面

程序范例1

图8.4所示是程序范例CH8_DemoForm005.cs的运行画面,它示范如何使用DataObject与Clipboard类将图形文件中的图像数据复制到剪贴板,然后再将剪贴板中的图像数据复制到文件中。完成本程序的执行操作后,剪贴板中的图像数据会分别被复制到C磁盘的Test.bmp、Test.gif与Test.jpeg等3个图形文件中。

相关程序代码如下所示:
privatevoid btnCopyImageToClipboard_Click(

object sender, EventArgs e)

{

try

{

// 创建一个 DataObject 对象。
DataObject myDataObject
=new DataObject();



// 将项目的图像资源存入 DataObject 对象中,

// 并设定图像数据可以被转换成其他格式。
myDataObject.SetData(

DataFormats.Bitmap,
true

Resources.章立民的大头照);



// 将持有图形文件的图像数据的 DataObject 对象

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

btnSaveClipboardToFile.Enabled
=true;

}

...

}



// 将剪贴板中的图像数据复制到文件中。privatevoid btnSaveClipboardToFile_Click(

object sender, EventArgs e)

{

try

{

// 将剪贴板中的数据以一个实现 IDataObject接口的对象返回。
IDataObject oDataObj
= Clipboard.GetDataObject();



if (oDataObj !=null)

{

// 检测从剪贴板所返回的数据是否存在Windows位图的格式。if (oDataObj.GetDataPresent(DataFormats.Bitmap))

{

// 以Windows位图格式取得影像数据。
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详细示范如何以各种格式将数据存入剪贴板并且从剪贴板中以特定格式撷取数据。首先,我们来查看其功能特性:
  • 您可以将文本字符串“From Microsoft Community!”以特定的格式或所有的格式(即多重格式)复制到剪贴板中,然后再以特定格式从剪贴板中撷取出来并贴入RichTextBox或TextBox控件中。
    以图8.5所示的操作而言,我们将文本字符串“From Microsoft Community!”以所有的格式(即多重格式)复制到剪贴板中,然后以Rich TextFormat从剪贴板中撷取出来。请注意,由于我们以多重格式将数据存入剪贴板,因此在“粘贴为”的子菜单项目中会列出剪贴板中所有可用的格式。
    以图8.6所示的操作而言,我们将文本字符串“From Microsoft Community!”以HTM格式复制到剪贴板中,然后以HTML格式从剪贴板中撷取出来。请注意,由于我们以单一格式将数据存入剪贴板,因此在“粘贴为”的子菜单项目中只会列出一种格式。

    \

    图8.5将文本字符串以所有格式进行复制,以Rich Text格式撷取

    \

    图8.6将文本字符串以HTM格式进行

    关键词:VS.NET