2

我使用 Delphi 10.2 Tokyo(使用 FireMonkey)创建了一个简单的应用程序,它显示图像并允许您为所选图像设置桌面墙纸。设置桌面壁纸的主要代码是:

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

虽然这在应用程序在桌面上运行(作为独立安装)时效果很好,但在作为提交到 Windows 10 App Store 的 APPX(在认证过程中)运行时会失败。将壁纸设置为 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.如果有人可以查看这个并让我知道我做错了什么,我将不胜感激......

4

0 回答 0