Поддерживает ли история буфера обмена WinRT только текст и изображения? - PullRequest
0 голосов
/ 03 августа 2020

Я делаю приложение C ++ / WinRT, которое использует историю буфера обмена Window 10, но по какой-то причине я могу получать только текст и изображения.

Мой код немного похож на этот ..

auto history = Clipboard::GetHistoryItemsAsync().get();

if (history.Status() == ClipboardHistoryItemsResultStatus::Success)
{
    auto historyItemList = history.Items();
    for (const auto& historyitem : historyItemList)
    {
        //Works
        if (dataPackageView.Contains(StandardDataFormats::Text()))
        {
            GetClipboardText(dataPackageView);
        }

        //Works
        if (dataPackageView.Contains(StandardDataFormats::Bitmap()))
        {
            GetClipboardBitmap(dataPackageView);
        }

        //Never triggers
        if (dataPackageView.Contains(StandardDataFormats::Html()))
        {
            GetClipboardHtml(dataPackageView);
        }
    
        //Never triggers
        if (dataPackageView.Contains(StandardDataFormats::StorageItems()))
        {
            GetClipboardStorageItems(dataPackageView);
        }
        //etc..

Я бы хотел использовать другие форматы данных. НАПРИМЕР: Для StorageItems я ожидал, что я CTRL + C элемент со своего рабочего стола или если я сделаю это программно с помощью

dataPackage.SetStorageItems({ std::begin(files), std::end(files) });    
Clipboard::SetContent(dataPackage);
Clipboard::Flush(); 

Файл окажется в истории буфера обмена, чтобы я мог обрабатывать его, как в первый фрагмент. Но файл никогда не появляется в возвращенном контейнере Clipboard :: GetHistoryItemsAsyn c (). Я также не вижу файл в средстве просмотра истории, когда вы нажимаете WIN + V. только "необработанный текст и изображения"? Могу я не использовать другие свойства dataformat? (ApplicationLink, Html, Rtf, StorageItems, Uri, Weblink et c)

Я привел StorageItems в качестве примера, но это происходит и с другими форматами. Если я CTRL + C веб-ссылка (например: { ссылка }), я ожидал, что dataPackageView.Contains (StandardDataFormats :: WebLink ()) или Uri сработает, но они не Если история буфера обмена может поддерживать другие форматы, как вы на самом деле его используете?

Изменить: забыл добавить. Когда я программно добавил StorageItem в буфер обмена, я также попробовал, как показано ниже. Не знаю, почему я не могу добавлять строки в IVector.

auto options = ClipboardContentOptions();

auto formats = Windows::Foundation::Collections::IVector<hstring>();

formats.Append(StandardDataFormats::StorageItems()); //Unhandled Exception

options.IsAllowedInHistory(true);
options.IsRoamable(true);
options.HistoryFormats() = formats;
options.RoamingFormats() = formats;


Clipboard::Clipboard::Clear();
Clipboard::SetContentWithOptions(dataPackage, options);
Clipboard::Flush();

1 Ответ

1 голос
/ 30 августа 2020

Как заметил мой уважаемый коллега Файванг - MSFT, Windows 'история буфера обмена и синхронизация облачного буфера обмена c поддерживает только ограниченное количество форматов данных буфера обмена, и это отражено в API буфера обмена UWP в Windows Время выполнения Clipboard класс.

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

Начиная с Windows 10 версии 2004 (также известной как сборка 19041, также известная как обновление за май 2020 г.), история буфера обмена поддерживает следующие форматы данных буфера обмена, определенные в StandardDataFormats:

  • Обычный текст: StandardDataFormats.Text
  • Различные форматы URI: StandardDataFormats.Uri, StandardDataFormats.WebLink и StandardDataFormats.ApplicationLink
  • HTML формат буфера обмена: StandardDataFormats.Html
  • Растровые изображения: StandardDataFormats.Bitmap

Для совместимости с классическими c настольными приложениями (также известными как приложения Win32) история буфера обмена также поддерживает несколько буферов обмена форматы данных, имена которых не входят в StandardDataFormats, но которые система Windows может автоматически преобразовывать в и из перечисленных выше форматов StandardDataFormats, когда это необходимо приложению, пытающемуся вставить определенный формат.

История буфера обмена не поддерживает какие-либо другие пользовательские или широко известные форматы буфера обмена.

Учитывая вышеизложенное, единственное, что я вижу в ваших результатах, которое кажется странным, - это то, что ваше приложение не читает формат HTML. Я не знаю каких-либо ошибок реализации Windows в этой области - попробуйте еще немного поиграть со своим кодом, и если у вас все еще есть проблемы, я определенно рекомендую вам задать еще один вопрос или связаться с нами в Microsoft другим способом ( например, через Feedback Hub).

Я действительно заметил, что документация Microsoft по истории буфера обмена с концептуальной технической точки зрения отсутствует. Я также рекомендую вам сообщать о проблемах GitHub в тех местах, где история буфера обмена задокументирована, например https://github.com/MicrosoftDocs/winrt-api - мы всегда слушаем.

...