Как мне получить список всех данных из истории буфера обмена в C #?

#c# #clipboard #clipboarddata

#c# #буфер обмена #clipboarddata

Вопрос:

Я хочу получить список всех данных из истории буфера обмена, но я не могу найти метод перечисления. Может быть, я чего-то не хватает или каким другим способом я могу это сделать? Я не могу найти метод enumerator в классе clipboard.

 var clip = Clipboard.GetDataObject();

foreach (var item in clip)
{
    MessageBox.Show(item);
}
 

Комментарии:

1. Я не знаю, как работает история буфера обмена, но Clipboard класс представляет собой довольно тонкую оболочку вокруг традиционной IDataObject реализации буфера обмена Windows. Когда программа помещает что-то в буфер обмена, оно может содержать один или несколько форматов буфера обмена (например, Excel может помещать скопированные данные в буфер обмена в виде текста, в виде таблицы, в виде объекта, специфичного для Excel, и в виде изображения в двух или более форматах). Пользователь буфера обмена может запросить форматы и решить, какой формат имеет наибольший смысл. Сделать Clipboard.GetText это легко, если вы хотите работать с другими форматами, это более

2. Вызовите метод IDataObject GetFormats(false) , затем используйте эту коллекцию в качестве перечислителя , извлекая данные для всех форматов, которые он включает ( IDataObject.GetData(string, bool) ) . Это долгий путь…

3. @Flydog57 Я видел примеры того, как работать с несколькими форматами, но GetText возвращает только последний скопированный элемент, а не список.

4. Вы имеете в виду историю буфера обмена в Windows 10 ( WIN V при включении)? Вам нужен WinRT API для доступа к этим объектам (управляемым способом).

5. Вызов API среды выполнения Windows в настольных приложениях

Ответ №1:

Я смог получить историю буфера обмена, сославшись на класс Clipboard из WinRT API в моем приложении WPF.

 using Clipboard = Windows.ApplicationModel.DataTransfer.Clipboard;

Task.Run(async () => {
    var items = await Clipboard.GetHistoryItemsAsync();
    foreach (var item in items.Items)
    {
        string data = await item.Content.GetTextAsync();
        MessageBox.Show(data);
    }
});
 

Мне также пришлось установить свою целевую платформу на .NET 5.0 с версией TFM, и для этого не нужны были какие-либо пакеты NuGet. Вам понадобится Microsoft.Пакет Windows.SDK.Contracts NuGet в более ранних версиях .NET.

 <TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>