我正在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
函数,它具有相同的问题。同样,此问题并非特定于多台显示器,只有一台显示器会发生相同的事情。