
В преддверии Евро 2012 решил написать программу, устанавливающую на рабочий стол изображение из веб-камер Донбасс Арены.
Алгоритм весьма прост и состоит всего из нескольких пунктов:
- Получить путь к файлу, куда Windows сохраняет текущее изображение рабочего стола.
- Загрузить изображение из сайта и сохранить его по полученному на первом шаге пути.
- Дать команду на обновление картинки рабочего стола.
Путь к файлу текущей картинки рабочего стола можно получить из реестра, прочитав данные параметра «Wallpaper» ключа «HKEY_CURRENT_USER\Control Panel\Desktop»:
String value = ""; try { RegistryKey hkey = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", false); value = (String) hkey.GetValue("Wallpaper"); hkey.Close(); } catch (Exception) { value = ""; }
value будет хранить что-то наподобие «C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper.jpg»
Второй шаг средствами C# можно реализовать двумя строчками:
WebClient client = new WebClient(); client.DownloadFile(fromUrl, pathToFile);
Файл по адресу fromUrl скачается в указанное место pathToFile, без лишних вопросов заменив предыдущий, если таковой был.
На третьем шаге пришлось немного повозиться. Команда на обновление картинки рабочего стола в WinAPI выглядит так:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, NULL, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
Но как вызвать эту команду средствами .NET я не знал, хотя давненько в книгах Александра Климова видел, что это возможно. На помощь мне пришел сайт pinvoke.net который и помог мне написать этот незамысловатый кусок кода:
public static void updateWallpaper() { SystemParametersInfo(SPI.SETDESKWALLPAPER, 0, null, SPIF.SENDCHANGE | SPIF.UPDATEINIFILE); } [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool SystemParametersInfo(SPI uiAction, uint uiParam, String pvParam, SPIF fWinIni); private enum SPI { SETDESKWALLPAPER = 0x0014 } private enum SPIF { UPDATEINIFILE = 0x01, SENDCHANGE = 0x02 }
Остальное время было потрачено на интерфейс:

Итог
Программа висит в трее
Исходники можно скачать здесь, а саму программу здесь.
Для работы нужен .NET Framework 2.0 или выше.
Всем спасибо за внимание!
