Как создать собственный формат буфера обмена в приложении WinForms
Посмотрите на это изображение:
Снимок экрана создается путем копирования одного из контактов в вашем списке Skype. Данные содержат необработанные байты, содержащие информацию, которую скайп, по-видимому, считает полезной (в данном случае имя контакта и размер имени).
Я хотел бы сделать это сам.
Вот код, который я использовал при попытке скопировать в буфер
byte[] bytes = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
Clipboard.SetData("My Data", bytes);
Который копирует в буфер обмена. Однако я получаю запись DataObject вместе с некоторыми дополнительными данными, добавленными к ней, а не просто необработанные байты:
Верхняя половина - это то, что я вижу. Нижняя половина - когда я делаю скриншот экрана. Обратите внимание, что это просто необработанные растровые данные.
Это можно сделать в.NET?
1 ответ
Дополнительные байты являются заголовками сериализации. Смотрите эту заметку из документации MSDN на Clipboard
класс (акцент мой):
Объект должен быть сериализуемым, чтобы поместить его в буфер обмена. Если вы передадите несериализуемый объект методу буфера обмена, метод завершится неудачей без исключения. См. System.Runtime.Serialization для получения дополнительной информации о сериализации. Если целевое приложение требует очень специфического формата данных, заголовки, добавленные к данным в процессе сериализации, могут помешать приложению распознавать ваши данные. Чтобы сохранить формат данных, добавьте данные в виде байтового массива в MemoryStream и передайте MemoryStream методу SetData.
Таким образом, решение состоит в том, чтобы сделать это:
byte[] bytes = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
MemoryStream stream = new MemoryStream(bytes);
Clipboard.SetData("My Data", stream);