Show / Hide Table of Contents

Практическое руководство. Добавление данных в буфер обмена

Класс Clipboard предоставляет методы, которые можно использовать для взаимодействия с буфером обмена операционной системы Windows. Многие приложения используют буфер обмена в качестве временного хранилища данных. Например текстовые редакторы используют буфер обмена во время операций вырезания и вставки. Буфер обмена также полезен для передачи данных из одного приложения в другое.

При добавлении данных в буфер обмена, можно указать формат данных, таким образом другие приложения могут распознать данные, если они поддерживают этот формат. Можно также добавить данные в буфер обмена в нескольких различных форматах, чтобы увеличить число приложений, которые потенциально могут использовать эти данные.

Формат буфера обмена — это строка, которая определяет имя формата данных, с помощью которой приложения могут получить данные нужного формата из буфера обмена. Класс DataFormats предоставляет имена стандартных форматов. Можно также использовать собственные имена форматов или использовать тип объекта в качестве его формата.

Чтобы добавить данные в буфер обмена в одном или нескольких форматах, используйте метод SetDataObject. В этот метод можно передать любой сериализуемый объект, но для добавления данных в нескольких форматах, необходимо поместить данные в объект, предназначенный для работы с несколькими форматами. Как правило, для этого используется тип DataObject, но вы можете использовать любой тип, реализующий интерфейс IDataObject.

Для добавления данных в одном из стандартных форматов можно использовать метод, соответствующий этому формату. Например, для текста это SetText.

Note

Все приложения Windows используют буфер обмена. Таким образом, его содержимое может меняться при переходе в другое приложение.

Класс Clipboard может использоваться только в однопотоковом режиме (STA). Чтобы использовать этот класс, убедитесь, что ваш метод Main помечен атрибутом STAThreadAttribute.

Объект должен поддерживать сериализацию для помещения в буфер обмена. Чтобы сделать тип сериализуемым, необходимо отметить его атрибутом SerializableAttribute. Если методу буфера обмена передается несериализуемый объект, метод завершится с ошибкой без выдачи исключения. Дополнительные сведения о сериализации см. в разделе System.Runtime.Serialization.

Для добавления данных в буфер обмена в одном стандартном формате

  1. Используйте методы 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;
    }
    

Для добавления данных в буфер обмена в пользовательском формате

  1. Используйте метод 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; }
        }
    }
    

Для добавления данных в буфер обмена в нескольких форматах

  1. Используйте метод 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; }
        }
    }
    

См. также

  • Операции перетаскивания и поддержка буфера обмена
  • Практическое руководство. Извлечение данных из буфера обмена
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX