65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 .NET 处理剪贴板

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.72/5 (49投票s)

2002年4月28日

CPOL

4分钟阅读

viewsIcon

546899

downloadIcon

6859

关于使用剪贴板的介绍。

剪贴板

当您复制或剪切某些文本、图像、文件或文件夹时,您的数据会存储在剪贴板中。剪贴板在各个进程之间是通用的,这意味着我们可以使用剪贴板作为在两个进程之间传输数据的机制。Win32 提供了 Clipboard API,其中包含像 OpenClipboardGetClipboardData 这样的函数,您可能大多数人都熟悉。在 .NET 中,Microsoft 将这些函数的大部分功能封装到一些类中。其中最突出的是一个类,它被恰当地命名为 Clipboard。它是一个非常简单的类,只有两个函数。在本文中,我们将看到如何复制/粘贴文本、图像以及如何维护多种格式的剪贴板数据。

我要感谢 James Johnson 在我捣鼓剪贴板时提供的惊人帮助。我没有参考书来帮助我,但这并不重要,因为 James 弥补了这一点。可怜的 Mike Dunn 不得不忍受一些 .NET 讨论,当时他走进 Bob's HungOut,恰好我正在和 James 讨论一个问题。无论如何,现在让我们继续正题。

将文本复制到剪贴板

Clipboard 类有一个 SetDataObject 函数,用于插入剪贴板数据。它在单个参数重载中接受一个 Object 作为参数。在另一个重载中,它同时接受一个 Object 和一个 bool 变量,如果希望剪贴板在我们的应用程序退出后仍然存在,我们可以将其设置为 true。在我们的示例程序中,我们将使用第二个重载,因为这似乎是更常见的情况,在这种情况下,我们希望其他程序访问我们复制到剪贴板上的内容。

Clipboard.SetDataObject(textBox1.Text,true);

从剪贴板检索文本

Clipboard 类还有一个 GetDataObject 函数,该函数返回一个 IDataObjectIDataObject 接口有一个名为 GetDataPresent 的函数,我们使用它来确定 IDataObject 是否具有特定格式的数据。我们可以使用 DataFormats 类的静态字段来验证我们期望的格式确实在 IDataObject 中可用。如果 GetDataPresent 返回 true,那么我们可以使用 GetData 函数来检索我们期望的数据格式。

if(Clipboard.GetDataObject().GetDataPresent(DataFormats.Text))
    textBox1.Text = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString();
else
    textBox1.Text  = "The clipboad does not contain any text";

观察我如何从记事本中复制一些文本并将其粘贴到我们的示例程序中。您也可以从我们的程序中复制文本并将其粘贴到记事本中。我希望您也喜欢我的 XP 主题和颜色。

从剪贴板复制/检索图像

这与复制和粘贴文本完全相同,只是我们使用 DataFormats.Bitmap 格式而不是 DataFormats.Text

Clipboard.SetDataObject(pictureBox1.Image,true);
if(Clipboard.GetDataObject().GetDataPresent(DataFormats.Bitmap))
    pictureBox1.Image = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap);

我已经从画图中复制到我们的示例程序中。然后,您可以使用画图复制其他内容,返回我们的程序,复制图像并粘贴回画图。图像已经拉伸了一些,因为我将 Picture 控件的 SizeMode 属性设置为 StretchImage

在剪贴板中维护多种格式

在某些情况下,您不确定复制/粘贴循环的目标应用程序期望在剪贴板中接收什么类型的数据。在这种情况下,我们可以在剪贴板中维护多种数据格式,以便目标应用程序可以检索其期望的数据格式。在我们的示例中,我们将编辑框中的文本以及图片控件中的图像都复制到剪贴板中。现在,您可以打开记事本并将其粘贴到文本中,以及打开画图并将其粘贴到位图中。我提供了一个 [粘贴两者] 按钮,以便于演示。只需运行示例程序的第二个实例,我们就可以将文本和图像都粘贴到相应的控件中。

我们使用实现了 IDataObject 接口的 DataObject 类。我们两次调用 SetData 函数,每次都传入不同的格式数据。我们使用该函数的以下重载:-

[ClassInterface(ClassInterfaceType.None)]
public virtual void SetData(
   string format, //This indicates what type of data this is going to be
   bool autoConvert, //Set this true to allow automatic data format conversions
   object data //The actual data [which is in the format specified above]
);

代码非常简单。我们创建一个 DataObject 对象,使用 SetData 两次,一次使用文本,然后使用图像,然后我们将此 DataObject 添加到剪贴板。

DataObject m_data = new DataObject();
m_data.SetData(DataFormats.Text,true,textBox1.Text);
m_data.SetData(DataFormats.Bitmap,true,pictureBox1.Image);
Clipboard.SetDataObject(m_data,true);

现在,您可以将其同时粘贴到记事本和任何允许您粘贴位图的图形应用程序中。

© . All rights reserved.