- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

  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 [2] который и помог мне написать этот незамысловатый кусок кода:

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
}

Остальное время было потрачено на интерфейс:
Донбасс Арена на рабочем столе

Итог

Программа висит в трее и нещадно кушает трафик, обновляя рабочий стол.

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

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

Автор: aNNiMON


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/7845

Ссылки в тексте:

[1] веб-камер: http://donbass-arena.com/ru/webcam/

[2] pinvoke.net: http://pinvoke.net/default.aspx/user32/SystemParametersInfo.html

[3] здесь: https://docs.google.com/open?id=0B3TcatFyw2R-MWVUN3NJVWRtTTQ

[4] здесь: https://docs.google.com/open?id=0B3TcatFyw2R-ZWtPZ1Vxa3RSaWs