在UWP应用中通过Active Desktop设置墙纸会更改适合模式

时间:2018-11-02 15:49:02

标签: c# windows uwp wallpaper

我正在C#中使用“活动桌面”界面来更改Windows中的桌面墙纸。我只使用IActiveDesktop.SetWallpaper方法,从不使用IActiveDesktop.SetWallpaperOptions,所以我希望只有墙纸图像会发生变化,而不会改变其适合度(平铺,拉伸,填充等)。

当我将代码编译为.NET桌面应用程序时,其行为符合预期。但是,当我使用Desktop Bridge将应用程序编译为Windows应用商店的UWP应用程序时,墙纸的大小会发生变化,而不仅仅是图像。我不明白为什么将我的代码作为UWP应用运行会导致Active Desktop界面的行为有所不同。

例如,如果我在Windows 10设置应用程序中选择“跨度”以使墙纸在两台显示器上伸展,则我的UWP应用程序将不遵守此设置。当它更改墙纸图像时,适合度也会更改,以在每个监视器上分别显示图像。但是我的应用程序的.NET桌面版本尊重墙纸的适合设置,并且不会对其进行更改。

我已经在下面包含了我代码的相关部分。整个文件可以找到here

[ComImport]
[Guid("F490EB00-1240-11D1-9888-006097DEACF9")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IActiveDesktop
{
    [PreserveSig]
    int ApplyChanges(AD_Apply dwFlags);
    [PreserveSig]
    int SetWallpaper([MarshalAs(UnmanagedType.LPWStr)] string pwszWallpaper, int dwReserved);
}

public class WallpaperChanger
{
    public static readonly Guid CLSID_ActiveDesktop =
        new Guid("{75048700-EF1F-11D0-9888-006097DEACF9}");

    public static IActiveDesktop GetActiveDesktop()
    {
        Type typeActiveDesktop = Type.GetTypeFromCLSID(WallpaperChanger.CLSID_ActiveDesktop);
        return (IActiveDesktop)Activator.CreateInstance(typeActiveDesktop);
    }

    public static void SetWallpaper(string imagePath)
    {
        IActiveDesktop iad = GetActiveDesktop();
        iad.SetWallpaper(imagePath, 0);
        iad.ApplyChanges(AD_Apply.ALL | AD_Apply.FORCE | AD_Apply.BUFFERED_REFRESH);
    }
}

注意:我已经尝试使用Windows UWP库中提供的SetWallpaperAsync函数,它具有相同的问题。同样,此问题并非特定于多台显示器,只有一台显示器会发生相同的事情。

0 个答案:

没有答案