Практическое руководство. Добавление данных в буфер обмена
Класс Clipboard предоставляет методы, которые можно использовать для взаимодействия с буфером обмена операционной системы Windows. Многие приложения используют буфер обмена в качестве временного хранилища данных. Например текстовые редакторы используют буфер обмена во время операций вырезания и вставки. Буфер обмена также полезен для передачи данных из одного приложения в другое.
При добавлении данных в буфер обмена, можно указать формат данных, таким образом другие приложения могут распознать данные, если они поддерживают этот формат. Можно также добавить данные в буфер обмена в нескольких различных форматах, чтобы увеличить число приложений, которые потенциально могут использовать эти данные.
Формат буфера обмена — это строка, которая определяет имя формата данных, с помощью которой приложения могут получить данные нужного формата из буфера обмена. Класс DataFormats предоставляет имена стандартных форматов. Можно также использовать собственные имена форматов или использовать тип объекта в качестве его формата.
Чтобы добавить данные в буфер обмена в одном или нескольких форматах, используйте метод SetDataObject. В этот метод можно передать любой сериализуемый объект, но для добавления данных в нескольких форматах, необходимо поместить данные в объект, предназначенный для работы с несколькими форматами. Как правило, для этого используется тип DataObject, но вы можете использовать любой тип, реализующий интерфейс IDataObject.
Для добавления данных в одном из стандартных форматов можно использовать метод, соответствующий этому формату. Например, для текста это SetText.
Note
Все приложения Windows используют буфер обмена. Таким образом, его содержимое может меняться при переходе в другое приложение.
Класс Clipboard может использоваться только в однопотоковом режиме (STA). Чтобы использовать этот класс, убедитесь, что ваш метод Main
помечен атрибутом STAThreadAttribute.
Объект должен поддерживать сериализацию для помещения в буфер обмена. Чтобы сделать тип сериализуемым, необходимо отметить его атрибутом SerializableAttribute. Если методу буфера обмена передается несериализуемый объект, метод завершится с ошибкой без выдачи исключения. Дополнительные сведения о сериализации см. в разделе System.Runtime.Serialization.
Для добавления данных в буфер обмена в одном стандартном формате
Используйте методы SetAudio, SetFileDropList, SetImage, или SetText.
// Demonstrates SetAudio, ContainsAudio, and GetAudioStream. public System.IO.Stream SwapClipboardAudio( System.IO.Stream replacementAudioStream) { System.IO.Stream returnAudioStream = null; if (Clipboard.ContainsAudio()) { returnAudioStream = Clipboard.GetAudioStream(); Clipboard.SetAudio(replacementAudioStream); } return returnAudioStream; } // Demonstrates SetFileDropList, ContainsFileDroList, and GetFileDropList public System.Collections.Specialized.StringCollection SwapClipboardFileDropList( System.Collections.Specialized.StringCollection replacementList) { System.Collections.Specialized.StringCollection returnList = null; if (Clipboard.ContainsFileDropList()) { returnList = Clipboard.GetFileDropList(); Clipboard.SetFileDropList(replacementList); } return returnList; } // Demonstrates SetImage, ContainsImage, and GetImage. public System.Drawing.Image SwapClipboardImage( System.Drawing.Image replacementImage) { System.Drawing.Image returnImage = null; if (Clipboard.ContainsImage()) { returnImage = Clipboard.GetImage(); Clipboard.SetImage(replacementImage); } return returnImage; } // Demonstrates SetText, ContainsText, and GetText. public String SwapClipboardHtmlText(String replacementHtmlText) { String returnHtmlText = null; if (Clipboard.ContainsText(TextDataFormat.Html)) { returnHtmlText = Clipboard.GetText(TextDataFormat.Html); Clipboard.SetText(replacementHtmlText, TextDataFormat.Html); } return returnHtmlText; }
Для добавления данных в буфер обмена в пользовательском формате
Используйте метод SetData, передавая в него имя пользовательского формата.
В метод SetData можно также передавать имена стандартных форматов. Дополнительные сведения см. в разделе DataFormats.
// Demonstrates SetData, ContainsData, and GetData // using a custom format name and a business object. public Customer TestCustomFormat { get { Clipboard.SetData("CustomerFormat", new Customer("Customer Name")); if (Clipboard.ContainsData("CustomerFormat")) { return Clipboard.GetData("CustomerFormat") as Customer; } return null; } }
[Serializable] public class Customer { private string nameValue = string.Empty; public Customer(String name) { nameValue = name; } public string Name { get { return nameValue; } set { nameValue = value; } } }
Для добавления данных в буфер обмена в нескольких форматах
Используйте метод SetDataObject и передайте в него DataObject, содержащий нужные данные.
// Demonstrates how to use a DataObject to add // data to the Clipboard in multiple formats. public void TestClipboardMultipleFormats() { DataObject data = new DataObject(); // Add a Customer object using the type as the format. data.SetData(new Customer("Customer as Customer object")); // Add a ListViewItem object using a custom format name. data.SetData("CustomFormat", new ListViewItem("Customer as ListViewItem")); Clipboard.SetDataObject(data); DataObject retrievedData = (DataObject)Clipboard.GetDataObject(); if (retrievedData.GetDataPresent("CustomFormat")) { ListViewItem item = retrievedData.GetData("CustomFormat") as ListViewItem; if (item != null) { MessageBox.Show(item.Text); } } if (retrievedData.GetDataPresent(typeof(Customer))) { Customer customer = retrievedData.GetData(typeof(Customer)) as Customer; if (customer != null) { MessageBox.Show(customer.Name); } } }
[Serializable] public class Customer { private string nameValue = string.Empty; public Customer(String name) { nameValue = name; } public string Name { get { return nameValue; } set { nameValue = value; } } }