Донбасс Арена на рабочем столе

в 17:53, , рубрики: .net, Программирование, рабочий стол, метки: ,

Донбасс Арена на рабочем столе

В преддверии Евро 2012 решил написать программу, устанавливающую на рабочий стол изображение из веб-камер Донбасс Арены.

Алгоритм весьма прост и состоит всего из нескольких пунктов:

  1. Получить путь к файлу, куда Windows сохраняет текущее изображение рабочего стола.
  2. Загрузить изображение из сайта и сохранить его по полученному на первом шаге пути.
  3. Дать команду на обновление картинки рабочего стола.

Путь к файлу текущей картинки рабочего стола можно получить из реестра, прочитав данные параметра «Wallpaper» ключа «HKEY_CURRENT_USERControl PanelDesktop»:

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%AppDataRoamingMicrosoftWindowsThemesTranscodedWallpaper.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 или выше.

Всем спасибо за внимание!

Автор: aNNiMON

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js