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.
Был бы признателен, если бы кто-то мог просмотреть это и сообщить мне, что я делаю неправильно...