Как создать собственный формат буфера обмена в приложении WinForms

Посмотрите на это изображение:

img2

Снимок экрана создается путем копирования одного из контактов в вашем списке Skype. Данные содержат необработанные байты, содержащие информацию, которую скайп, по-видимому, считает полезной (в данном случае имя контакта и размер имени).

Я хотел бы сделать это сам.

Вот код, который я использовал при попытке скопировать в буфер

byte[] bytes = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
Clipboard.SetData("My Data", bytes);

Который копирует в буфер обмена. Однако я получаю запись DataObject вместе с некоторыми дополнительными данными, добавленными к ней, а не просто необработанные байты:

img2

Верхняя половина - это то, что я вижу. Нижняя половина - когда я делаю скриншот экрана. Обратите внимание, что это просто необработанные растровые данные.

Это можно сделать в.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);
Другие вопросы по тегам