2016-03-01 4 views
3

Я создаю приложение для совместного использования экрана. Когда начинается совместное использование экрана, я меняю цвет обоев рабочего стола на черный.Как восстановить/отменить обои для рабочего стола после изменения?

Проблема Как восстановить предыдущую тему обоев или окон?

Я использую код, чтобы изменить цвет фона на сплошной цвет, приведены ниже

Кроме того, есть проблема с этим кодом, когда фон меняется с помощью этого кода я не могу установить изображение как обои, однако я могу применять темы.

public class wallpaperHelper 
    { 
     public static void SetColor(Color color) 
     { 

      // Remove the current wallpaper 
      NativeMethods.SystemParametersInfo(
       NativeMethods.SPI_SETDESKWALLPAPER, 
       0, 
       "", 
       NativeMethods.SPIF_UPDATEINIFILE | NativeMethods.SPIF_SENDWININICHANGE); 

      // Set the new desktop solid color for the current session 
      int[] elements = { NativeMethods.COLOR_DESKTOP }; 
      int[] colors = { System.Drawing.ColorTranslator.ToWin32(color) }; 
      NativeMethods.SetSysColors(elements.Length, elements, colors); 

      // Save value in registry so that it will persist 
      RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Colors", true); 
      key.SetValue(@"Background", string.Format("{0} {1} {2}", color.R, color.G, color.B)); 
     } 

     private static class NativeMethods 
     { 
      public const int COLOR_DESKTOP = 1; 
      public const int SPI_SETDESKWALLPAPER = 20; 
      public const int SPIF_UPDATEINIFILE = 0x01; 
      public const int SPIF_SENDWININICHANGE = 0x02; 

      [DllImport("user32.dll")] 
      public static extern bool SetSysColors(int cElements, int[] lpaElements, int[] lpaRgbValues); 

      [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
      public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni); 
     } 
    } 

ответ

5

Вы можете получить текущую WallPaper до изменения к другим:

int SPI_GETDESKWALLPAPER = 0x73; 
int MAX_PATH = 260; 
string wallpaper = new string('\0', (int)MAX_PATH); 
NativeMethods.SystemParametersInfo(SPI_GETDESKWALLPAPER, MAX_PATH, wallpaper, 0); 

wallpaper = wallpaper.Substring(0, wallpaper.IndexOf('\0')); 

Когда восстановить старые обои, просто передать его SystemParametersInfo.

NativeMethods.SystemParametersInfo(
    NativeMethods.SPI_SETDESKWALLPAPER, 
    0, 
    wallpaper, 
    NativeMethods.SPIF_UPDATEINIFILE | NativeMethods.SPIF_SENDWININICHANGE); 

АОЛО, если вы не хотите менять обои на постоянной основе, изменение:

NativeMethods.SystemParametersInfo(
    NativeMethods.SPI_SETDESKWALLPAPER, 
    0, 
    Newwallpaper, 
    NativeMethods.SPIF_UPDATEINIFILE | NativeMethods.SPIF_SENDWININICHANGE); 

To:

NativeMethods.SystemParametersInfo(
    NativeMethods.SPI_SETDESKWALLPAPER, 
    0, 
    Newwallpaper, 
    0); 

Это предотвратит окно сохранения текущего изменения. Ваши старые обои будут восстановлены при выключении компьютера и снова откроются. Очень полезно, если вы меняете WallPaper к чему-то чувствительным в полночь и забыть восстановить обратно :)

Примечание:

Если текущий обои тему вы можете скопировать его из:

C:\Users\<UserName>\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper 

Сохраните его где-нибудь. При необходимости установите обои для этого файла, а затем удалите их.

Для файла '.theme', скопируйте

C:\Users\<User-Name>\AppData\Local\Microsoft\Windows\Themes\Custom.theme 

сохранить его где-нибудь. При необходимости установите обои для этого файла, а затем удалите их.

rundll32.exe %SystemRoot%\system32\shell32.dll,Control_RunDLL %SystemRoot%\system32\desk.cpl desk,@Themes /Action:OpenTheme /file:"C:\pathtoYourTheme.theme" 

Если уверен, что старая тема, вы можете забрать его обратно из:

C:\Windows\Resources\Themes 


Для задачи цветового набора, вы хотите, чтобы избавиться от черного цвета за обоями? Один из вариантов - Desktop/Personalize/Desktop background изменить Position до Fill. Эта опция будет масштабировать изображение, чтобы он соответствовал экрану как по горизонтали, так и по вертикали.

+0

Пользовательские обои - это тема Windows 'C: \ Users \ vikas \ AppData \ Roaming \ Microsoft \ Windows \ Themes \ TranscodedWallpaper' Когда я пытаюсь задать тему, используя ваш код, но не работает, если я устанавливаю изображение, тогда его рабочий штраф –

+0

@VikasBansal, что 'TranscodedWallpaper' является изображением. Windows просто переименовывает его. Вы можете скопировать его в другое место, затем, когда это необходимо, передать его функции, а затем удалить. – Sakura

+0

Спасибо :) Многое спасибо Спасибо. –