Настройка обоев через Active Desktop в приложении UWP меняет режим подгонки - PullRequest
0 голосов
/ 02 ноября 2018

Я использую интерфейс Active Desktop в C # для смены обоев рабочего стола в Windows. Я использую только метод IActiveDesktop.SetWallpaper и никогда не использую IActiveDesktop.SetWallpaperOptions, поэтому я ожидаю, что изменится только изображение обоев, а не его подгонка (плитка, растяжение, заливка и т. Д.).

Когда я компилирую свой код как настольное приложение .NET, это ведет себя как ожидалось. Однако когда я использую Desktop Bridge для компиляции своего приложения в качестве приложения UWP для Магазина Windows, меняется размер обоев, а не только изображение. Я не понимаю, почему при запуске моего кода в качестве приложения UWP интерфейс Active Desktop должен вести себя по-другому.

Например, если я выберу «Размах» в приложении «Настройки Windows 10», чтобы обои растягивались на двух моих мониторах, мое приложение UWP не будет соответствовать этому параметру. При изменении изображения обоев изменяется также подгонка, чтобы изображение отображалось отдельно на каждом мониторе. Но настольная версия .NET моего приложения учитывает настройку подгонки обоев и не меняет ее.

Я включил соответствующую часть своего кода ниже. Весь файл можно найти здесь .

[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);
    }
}

Примечание. Я попытался использовать функцию SetWallpaperAsync, доступную в библиотеке Windows UWP, и у нее та же проблема. Также эта проблема не характерна для нескольких мониторов, то же самое происходит с одним монитором.

...