В преддверии Евро 2012 решил написать программу, устанавливающую на рабочий стол изображение из веб-камер Донбасс Арены.
Алгоритм весьма прост и состоит всего из нескольких пунктов:
- Получить путь к файлу, куда Windows сохраняет текущее изображение рабочего стола.
- Загрузить изображение из сайта и сохранить его по полученному на первом шаге пути.
- Дать команду на обновление картинки рабочего стола.
Путь к файлу текущей картинки рабочего стола можно получить из реестра, прочитав данные параметра «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