#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>