Delphi FireMonkey - Setting Wallpaper on Win 10 does not work when deployed as APPX

时间秒杀一切 提交于 2019-12-22 18:43:12

问题


I have created a simple application using Delphi 10.2 Tokyo (using FireMonkey) that displays images and allows you to set the desktop wallpaper for a selected image. The main code that sets the desktop wallpaper is:

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

While this works great when the application runs on the desktop (as a standalone install), it fails when run as an APPX (during the certification process) of submitting to the Windows 10 App Store. When setting the wallpaper as an APPX, the result is a black screen background instead of the selected image.

I thought that this was due to the APPX running in a constrained mode with access only to a virtual registry (and not the actual registry). So I changed the call to this:

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

This also works when run as a standalone application on the desktop. But even removing the parameter SPIF_UPDATEINIFILE does not get the app to work as an APPX package deployment - it still does not set the wallpaper and results in a black screen.

Would be interested in any guidance from this community about how I can set the desktop wallpaper and have it work even when packaged and deployed as an APPX. Thanks in advance!

Addendum: I am going off this documentation (excerpt below):

fWinIni [in]

Type: UINT

If a system parameter is being set, specifies whether the user profile is to be updated, and if so, whether the WM_SETTINGCHANGE message is to be broadcast to all top-level windows to notify them of the change.

This parameter can be zero if you do not want to update the user profile or broadcast the WM_SETTINGCHANGE message...

UPDATE 20170804:

Based on feedback from @Victoria and @DaveNottage, I took a stab at implementing WinRT calls as follows:

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;

Unfortunately this does not work and gives an error: No such interface supported. Would appreciate it if someone could look over this and let me know what I am doing wrong...

来源:https://stackoverflow.com/questions/45498863/delphi-firemonkey-setting-wallpaper-on-win-10-does-not-work-when-deployed-as-a

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!