Тема: AHK/CMD: Смена обоев рабочего стола
Здравствуйте!
Скажите пожалуйста можно ли с помощью AHK, менять обои рабочего стола, или может есть какие ключи для командной строки или подобных утилит типа nircmd?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте!
Скажите пожалуйста можно ли с помощью AHK, менять обои рабочего стола, или может есть какие ключи для командной строки или подобных утилит типа nircmd?
Писал такое когда-то. Требует наличия Gdip.ahk в пользовательской библиотеке.
SetWallpaper(sWallpaperPath, bTile = 0)
{
/*
Функция меняет заставку рабочего стола.
sWallpaperPath — путь к файлу с изображением
bTile = 0 — по центру
bTile = 1 — "замостить"
Требует наличия Gdip.ahk в пользовательской библиотеке.
http://www.autohotkey.net/~tic/Gdip.ahk
*/
SPI_SETDESKWALLPAPER = 0x14
SPIF_SENDWININICHANGE = 0x2
SPIF_UPDATEINIFILE = 0x1
SplitPath, sWallpaperPath,,, OutExtension
if OutExtension != bmp
{
File := A_WinDir "\ACD Wallpaper.bmp"
FileDelete, % File
if !pToken := Gdip_Startup()
{
MsgBox, 48, Ошибка GDI+!, Убедитесь в наличии gdiplus.dll в вашей системе!
ExitApp
}
pBitmap := Gdip_CreateBitmapFromFile(sWallpaperPath)
Gdip_SaveBitmapToFile(pBitmap, File)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
}
Else
File := sWallpaperPath
RegRead, Value1, HKCU, Control Panel\Desktop, Wallpaper
RegRead, Value2, HKCU, Control Panel\Desktop, TileWallpaper
if (Value1 = "" || Value2 = "")
{
MsgBox, 48, Несоответствие ключей реестра!
, % "Ключи реестра, с которыми работает программа,"
. "`nне существуют в Вашей системе!"
ExitApp
}
RegWrite, REG_SZ, HKCU, Control Panel\Desktop, Wallpaper, %File%
RegWrite, REG_SZ, HKCU, Control Panel\Desktop, TileWallpaper, %bTile%
DllCall("SystemParametersInfo", UInt, SPI_SETDESKWALLPAPER, UInt, 0
, Str, File, UInt, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE)
}
Но это для XP, не знаю, будет ли в семёрке работать.
Спасибо teadrinker, подойдет.
Вот искал и нашел команды, но в результате только синий экран почему то:
REG ADD "HKCU\Control Panel\Desktop" /v Wallpaper /d "D:\Picture\Pic.JPG" /f
RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters ,1 ,True
Потому что работает только с BMP файлами !
Мой код работает с любыми.
teadrinker
В W7 работает. Кстати, есть ещё параметр WallpaperStyle. Если выбрать "растянуть", то он меняется с 0 на 2. Можно, наверно, и его задействовать. В семёрке ещё добавились для него значения "по размеру" (6) и "заполнение" (10).
Мой код работает с любыми.
а можно Вашу строчку
DllCall("SystemParametersInfo", UInt, SPI_SETDESKWALLPAPER, UInt, 0, Str, File, UInt, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE)}
привести к такому же формату
RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters ,1 ,True
?
Евген, не понял вопроса. Что значит «привести к такому же формату» и зачем? Если «как то же самое сделать через cmd», то не знаю.
Кстати, есть ещё параметр WallpaperStyle. Если выбрать "растянуть", то он меняется с 0 на 2. Можно, наверно, и его задействовать. В семёрке ещё добавились для него значения "по размеру" (6) и "заполнение" (10).
Да, я про него забыл, почему-то. Тогда так:
SetWallpaper(sWallpaperPath, bTile = 0, iStyle = 0)
{
/*
Функция меняет заставку рабочего стола.
sWallpaperPath — путь к файлу с изображением
bTile = 0 — по центру
bTile = 1 — "замостить"
iStyle = 0 — по центру
iStyle = 2 — растянуть при bTile = 0
Только для Win 7 при bTile = 0:
iStyle = 6 — по размеру
iStyle = 10 — заполнение
Требует наличия Gdip.ahk в пользовательской библиотеке.
http://www.autohotkey.net/~tic/Gdip.ahk
*/
SPI_SETDESKWALLPAPER = 0x14
SPIF_SENDWININICHANGE = 0x2
SPIF_UPDATEINIFILE = 0x1
dFile := A_WinDir "\ACD Wallpaper.bmp"
SplitPath, sWallpaperPath,,, OutExtension
if OutExtension != bmp
{
if !pToken := Gdip_Startup()
{
MsgBox, 48, Ошибка GDI+!, Убедитесь в наличии gdiplus.dll в вашей системе!
ExitApp
}
pBitmap := Gdip_CreateBitmapFromFile(sWallpaperPath)
Gdip_SaveBitmapToFile(pBitmap, dFile)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
}
Else
FileMove, %sWallpaperPath%, %dFile%, 1
RegWrite, REG_SZ, HKCU, Control Panel\Desktop, Wallpaper, %dFile%
RegWrite, REG_SZ, HKCU, Control Panel\Desktop, TileWallpaper, %bTile%
RegWrite, Reg_SZ, HKCU, Control Panel\Desktop, WallpaperStyle, %iStyle%
DllCall("SystemParametersInfo", UInt, SPI_SETDESKWALLPAPER, UInt, 0
, Str, dFile, UInt, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE)
}
А чем отличается "по размеру" от "по центру"? И что такое "заполнение"?
Наверно, bTile и iStyle можно объединить в один параметр, проще будет.
При растягивании картинка может исказиться, если соотношение сторон не такое же как у экрана. Если выбрать "по размеру", то она растягивается только до тех пор, пока по вертикали или горизонтали не упрётся в края экрана. Часть экрана может остаться незакрытой. При заполнении она продолжает увеличиваться, пока весь экран не заполнится, при этом где-то она может вылезти за пределы, если не вписывается точно в экран. Но искажения в обоих случаях нет.
Сохранять что-то в папку Windows вообще-то идеологически неправильно. Семёрка, кстати, всё равно туда не пустит. По видимости картинка сохранится туда, а фактически в папку пользователя — C:\Users\User\AppData\Local\VirtualStore\Windows. Поначалу всё нормально, но после перезагрузки обои не находятся. Та же история с Program Files.
Про эту виртуализацию есть в статье Руссиновича — Управление учетными записями пользователей Windows Vista: взгляд изнутри.
А куда правильнее сохранять? В "Мои документы"?
По идее, эта преобразованная копия картинки — данные приложения, а не самого пользователя. Так что, наверно, в %AppData% приложение должно создать свою папку и туда такие вещи сохранять. Это если строго по идеологии.
Наверно, bTile и iStyle можно объединить в один параметр, проще будет.
Здравая идея!
Так что, наверно, в %AppData% приложение должно создать свою папку и туда такие вещи сохранять. Это если строго по идеологии.
Ну, раз в Windows не пускают, пусть в %AppData% полежит. Так работает?
SetWallpaper(sWallpaperPath, nStyle = 3)
{
/*
Функция меняет заставку рабочего стола.
sWallpaperPath — путь к файлу с изображением
nStyle = 1 — по центру
nStyle = 2 — замостить
nStyle = 3 — растянуть
Только для Win 7:
nStyle = 4 — по размеру
nStyle = 5 — заполнение
Требует наличия Gdip.ahk в пользовательской библиотеке.
http://www.autohotkey.net/~tic/Gdip.ahk
*/
SPI_SETDESKWALLPAPER = 0x14
SPIF_SENDWININICHANGE = 0x2
SPIF_UPDATEINIFILE = 0x1
bTile := nStyle = 2 ? 1 : 0
iStyle := (nStyle = 1 || nStyle = 2) ? 0 : nStyle = 4 ? 6 : nStyle = 5 ? 10 : 2
if !FileExist(A_AppData "\Wallpaper")
FileCreateDir, %A_AppData%\Wallpaper
dFile := A_AppData "\Wallpaper\Wallpaper.bmp"
SplitPath, sWallpaperPath,,, OutExtension
if OutExtension != bmp
{
if !pToken := Gdip_Startup()
{
MsgBox, 48, Ошибка GDI+, Убедитесь в наличии gdiplus.dll в вашей системе!
ExitApp
}
if !pBitmap := Gdip_CreateBitmapFromFile(sWallpaperPath)
{
MsgBox, 48, Ошибка GDI+, Невозможно извлечь изображение из файла.
Gdip_Shutdown(pToken)
ExitApp
}
Gdip_SaveBitmapToFile(pBitmap, dFile)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
}
Else
FileMove, %sWallpaperPath%, %dFile%, 1
RegWrite, REG_SZ, HKCU, Control Panel\Desktop, Wallpaper, %dFile%
RegWrite, REG_SZ, HKCU, Control Panel\Desktop, TileWallpaper, %bTile%
RegWrite, Reg_SZ, HKCU, Control Panel\Desktop, WallpaperStyle, %iStyle%
DllCall("SystemParametersInfo", UInt, SPI_SETDESKWALLPAPER, UInt, 0
, Str, dFile, UInt, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE)
}
Так работает?
Да, так работает нормально. Правда в первый раз Винда зачем-то перекодировала рисунок обратно в jpg и поместила в папку, где она хранит обои для текущей темы. Соответственно и в реестре путь указывал туда. Хотя в диалоге выбора обоев был путь к твоему файлу bmp. Но при последующих запусках скрипта такого уже не было. Попробовал, кстати, закомментировать вот эту строчку:
RegWrite, REG_SZ, HKCU, Control Panel\Desktop, Wallpaper, %dFile%
Работает и без неё, путь в реестре всё равно появляется.
Да, и вот это не совсем правильно, наверно:
Функция меняет заставку рабочего стола.
Т.к. провоцирует путаницу с заставкой экрана.
Попробовал, кстати, закомментировать вот эту строчку:
RegWrite, REG_SZ, HKCU, Control Panel\Desktop, Wallpaper, %dFile%
Работает и без неё, путь в реестре всё равно появляется.
Да, у меня тоже.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться