1

Тема: AHK/CMD: Смена обоев рабочего стола

Здравствуйте!
Скажите пожалуйста можно ли с помощью AHK, менять обои рабочего стола, или может есть какие ключи для командной строки или подобных утилит типа nircmd?

2

Re: AHK/CMD: Смена обоев рабочего стола

Писал такое когда-то. Требует наличия 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)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK/CMD: Смена обоев рабочего стола

Но это для XP, не знаю, будет ли в семёрке работать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK/CMD: Смена обоев рабочего стола

Спасибо teadrinker, подойдет.

Вот искал и нашел команды, но в результате только синий экран почему то:

REG ADD "HKCU\Control Panel\Desktop" /v Wallpaper /d "D:\Picture\Pic.JPG" /f
RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters ,1 ,True

5

Re: AHK/CMD: Смена обоев рабочего стола

Потому что работает только с BMP файлами !

Времени не хватает... :-(

6

Re: AHK/CMD: Смена обоев рабочего стола

Мой код работает с любыми.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK/CMD: Смена обоев рабочего стола

teadrinker
В W7 работает. Кстати, есть ещё параметр WallpaperStyle. Если выбрать "растянуть", то он меняется с 0 на 2. Можно, наверно, и его задействовать. В семёрке ещё добавились для него значения "по размеру" (6) и "заполнение" (10).

8

Re: AHK/CMD: Смена обоев рабочего стола

teadrinker пишет:

Мой код работает с любыми.

а можно Вашу строчку

DllCall("SystemParametersInfo", UInt, SPI_SETDESKWALLPAPER, UInt, 0, Str, File, UInt, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE)}

привести к такому же формату

RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters ,1 ,True

?

Времени не хватает... :-(

9

Re: AHK/CMD: Смена обоев рабочего стола

Евген, не понял вопроса. Что значит «привести к такому же формату» и зачем? Если «как то же самое сделать через cmd», то не знаю.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK/CMD: Смена обоев рабочего стола

YMP пишет:

Кстати, есть ещё параметр 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)
}

А чем отличается "по размеру" от "по центру"? И что такое "заполнение"?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11 (изменено: YMP, 2011-01-24 09:42:39)

Re: AHK/CMD: Смена обоев рабочего стола

Наверно, bTile и iStyle можно объединить в один параметр, проще будет.

При растягивании картинка может исказиться, если соотношение сторон не такое же как у экрана. Если выбрать "по размеру", то она растягивается только до тех пор, пока по вертикали или горизонтали не упрётся в края экрана. Часть экрана может остаться незакрытой. При заполнении она продолжает увеличиваться, пока весь экран не заполнится, при этом где-то она может вылезти за пределы, если не вписывается точно в экран. Но искажения в обоих случаях нет.

Сохранять что-то в папку Windows вообще-то идеологически неправильно. Семёрка, кстати, всё равно туда не пустит. По видимости картинка сохранится туда, а фактически в папку пользователя — C:\Users\User\AppData\Local\VirtualStore\Windows. Поначалу всё нормально, но после перезагрузки обои не находятся. Та же история с Program Files.

Про эту виртуализацию есть в статье Руссиновича — Управление учетными записями пользователей Windows Vista: взгляд изнутри.

12

Re: AHK/CMD: Смена обоев рабочего стола

А куда правильнее сохранять? В "Мои документы"?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK/CMD: Смена обоев рабочего стола

По идее, эта преобразованная копия картинки — данные приложения, а не самого пользователя. Так что, наверно, в %AppData% приложение должно создать свою папку и туда такие вещи сохранять. Это если строго по идеологии.

14

Re: AHK/CMD: Смена обоев рабочего стола

YMP пишет:

Наверно, bTile и iStyle можно объединить в один параметр, проще будет.

Здравая идея!

YMP пишет:

Так что, наверно, в %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)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK/CMD: Смена обоев рабочего стола

teadrinker пишет:

Так работает?

Да, так работает нормально. Правда в первый раз Винда зачем-то перекодировала рисунок обратно в jpg и поместила в папку, где она хранит обои для текущей темы. Соответственно и в реестре путь указывал туда. Хотя в диалоге выбора обоев был путь к твоему файлу bmp. Но при последующих запусках скрипта такого уже не было. Попробовал, кстати, закомментировать вот эту строчку:

RegWrite, REG_SZ, HKCU, Control Panel\Desktop, Wallpaper, %dFile%

Работает и без неё, путь в реестре всё равно появляется.

Да, и вот это не совсем правильно, наверно:

Функция меняет заставку рабочего стола.

Т.к. провоцирует путаницу с заставкой экрана.

16

Re: AHK/CMD: Смена обоев рабочего стола

YMP пишет:

Попробовал, кстати, закомментировать вот эту строчку:

RegWrite, REG_SZ, HKCU, Control Panel\Desktop, Wallpaper, %dFile%

Работает и без неё, путь в реестре всё равно появляется.

Да, у меня тоже.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder