Delphi FireMonkey - установка обоев на Win 10 не работает при развертывании в качестве APPX

Я создал простое приложение с использованием Delphi 10.2 Tokyo (с помощью FireMonkey), которое отображает изображения и позволяет установить обои для рабочего стола для выбранного изображения. Основной код, который устанавливает обои рабочего стола:

class procedure TUtilityWin.SetWallpaper(AFileName: String);
begin
      SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pChar(AFileName), (SPIF_UPDATEINIFILE OR SPIF_SENDWININICHANGE)); 
end;

Хотя это прекрасно работает, когда приложение запускается на настольном компьютере (в виде отдельной установки), при запуске в качестве APPX (во время процесса сертификации) происходит отправка в Windows 10 App Store. При установке обоев в качестве APPX, результатом будет черный фон экрана вместо выбранного изображения.

Я думал, что это из-за APPX, работающего в ограниченном режиме с доступом только к виртуальному реестру (а не к реальному реестру). Поэтому я изменил вызов на это:

SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pChar(AFileName), 0); 

Это также работает, когда запускается как отдельное приложение на рабочем столе. Но даже удаление параметра SPIF_UPDATEINIFILE не заставляет приложение работать как развертывание пакета APPX - оно по-прежнему не устанавливает обои и приводит к черному экрану.

Было бы интересно получить рекомендации от этого сообщества о том, как настроить обои рабочего стола и заставить их работать, даже когда они упакованы и развернуты как APPX. Заранее спасибо!

Приложение: Я собираюсь удалить эту документацию (отрывок ниже):

fWinIni [в]

Тип: UINT

Если системный параметр устанавливается, указывает, должен ли профиль пользователя обновляться, и если да, то должно ли сообщение WM_SETTINGCHANGE передаваться во все окна верхнего уровня, чтобы уведомить их об изменении.

Этот параметр может быть нулевым, если вы не хотите обновлять профиль пользователя или транслировать сообщение WM_SETTINGCHANGE...

ОБНОВЛЕНИЕ 20170804:

Основываясь на отзывах @Victoria и @DaveNottage, я попытался реализовать вызовы WinRT следующим образом:

Uses WinAPI.WinRT, WinApi.SystemRT, WinAPI.Storage, WinApi.Foundation.Types;

procedure TForm1.Button1Click(Sender: TObject);
const
  imgfname: String = 'C:\Users\rohit\Pictures\Camera Roll\WIN_20170302_12_12_33_Pro.jpg';
var
  isf_StorageFile: IAsyncOperation_1__IStorageFile;
  sfile: IStorageFile;
begin
  if TUserProfile_UserProfilePersonalizationSettings.IsSupported then
  begin
    isf_StorageFile:=TStorageFile.GetFileFromPathAsync(HSTRING(imgfname));
    isf_StorageFile.Completed:= AsyncOperationCompletedHandler_1__IStorageFile (
                                procedure (sf: IAsyncOperation_1__IStorageFile; status: AsyncStatus)
                                begin
                                  if status=AsyncStatus.Completed then
                                  begin
                                    sFile:=sf.GetResults;
                                    TUserProfile_UserProfilePersonalizationSettings.Current.TrySetWallpaperImageAsync(sFile);
                                  end;
                                end);
  end;
end;

К сожалению, это не работает и выдает ошибку: No such interface supported. Был бы признателен, если бы кто-то мог просмотреть это и сообщить мне, что я делаю неправильно...

0 ответов

Другие вопросы по тегам