1 (изменено: Zohann, 2012-12-30 10:57:19)

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

Программа "Обоина" сменяет обои при загрузке компьютера.
Возможности:
Смена обоев по порядку, циклически, случайно, принудительно (кнопка "Обновить")
Показ всплывающего окошка с информацией о файле и режиме.
Если файл для обоев последний (режим "По порядку"), будет загружен интерфейс программы.

1. Выбрать папку с изображениями
2. Выбрать режим смены
3. Сохранить данные
4. Включить авоматическую смену обоев (работает только при скомпилированном скрипте)

В аттаче скомпилированный файл.
Тестировалось на XP, 7
Требует подключения библиотеки Gdip (если уже подключена, необходимо удалить строку #include, Gdip.ahk)
Сама функция смены обоев рабочего стола взята здесь.

; --------------------- Переменные
ini = Settings.ini
Title = Обоина
Форматы = jpg,bmp
Режимы = По порядку|Зациклить|Случайно ; список режимов
StringSplit, тРежим, Режимы, |
; --------------------- Проверка
IfNotExist, %A_ScriptDir%\%ini% 
    FileAppend, , %A_ScriptDir%\%ini%
IniRead, Папка, %ini%, Настройки, Папка, Выберите папку с изображениями
IniRead, Файл, %ini%, Настройки, Файл, 0 ; чтение файла для смены обоев
IniRead, Режим, %ini%, Настройки, Режим, 0 ; чтение режима обновления
Loop 3    {
    If A_Index = %Режим%
        r%A_Index% = 1
    Else
        r%A_Index% = 0
    }
If Режим = 0 ; переключатель по умолчанию    
    r1 = 1
IniRead, Update, %ini%, Настройки, Update, 0
tBut1 := Update = 1 ? "Выключить" : "Включить"
If Update = 1  ; если обновление включено
    if 0 = 1 ; если запуск с ярлыка - обновить обои и закрыться
        {    
        If Updater() = "Закрыться"
            ExitApp
        }
; --------------------- Gui
Gui, Add, GroupBox, x5 w340 h46 Section, Папка с изображениями
Gui, Add, Edit, xp+8 yp+16 wp-47 R1 vПапка_новая, %Папка%
Gui, Add, Button, x+5 h22 gПуть, %A_Space%...%A_Space%
Gui, Add, Radio, x5 Checked%r1% gRd1 vРежим, %тРежим1%
Gui, Add, Radio, x+5 Checked%r2% gRd2, %тРежим2%
Gui, Add, Radio, x+5 Checked%r3% gRd3, %тРежим3%
Gui, Add, Button, x5 gСохранить, Сохранить
Gui, Add, Button, x+5 wp+2 gОбновить, Обновить
Gui, Add, Button, x+5 wp+2 gВыкл, %tBut1%
Gui, Add, Button, x+5 wp, Закрыть
; Gui,  +AlwaysOnTop
Gui, Show, , %Title%
Return
; --------------------- Режим обновления
Rd1:
Rd2:
Rd3:
    Gui, Submit, NoHide
    IniWrite, %Режим%, %ini%, Настройки, Режим ; запись режима обновления
Return
; --------------------- Принудительное обновление
Обновить:
    Gui, Submit, NoHide
    Updater(Папка_новая)
Return
; --------------------- Выключить/включить обновление
Выкл:
IfNotExist, %A_ScriptDir%\%ini% 
    Return
IniRead, Папка, %ini%, Настройки, Папка, Выберите папку с изображениями     
IfNotExist, %Папка%    
    Return
    IniRead, Update, %ini%, Настройки, Update, 0
Выкл1:    
    U1 := Update = 1 ? 0 : 1
    U := Update = 1 ? "Включить" : "Выключить"
    IniWrite, %U1%, %A_ScriptDir%\%ini%, Настройки, Update ; выключить/включить обновление
    ControlSetText, Button8, %U%
    IfNotExist, %A_Startup%\%Title%.lnk
        {
        FileCreateShortcut, %A_ScriptFullPath%, %A_Startup%\%Title%.lnk, %A_ScriptDir%, 0
        }
Return
; --------------------- Выбор папки
Путь:
    FileSelectFolder, dir, , , Папка с изображениями
    If ErrorLevel = 1
        Return    
    ControlSetText, Edit1, %dir%
Return
; --------------------- Сохранение данных
Сохранить:
    Gui, Submit, NoHide
    IfExist, %Папка_новая%
        {
        n := ПроверкаНаличияИзображений(Папка_новая, FirstFile)
        If n >= 1
            {
            MsgBox, 64, Готово!, Всего изображений:  %n%`nНажмите "Включить" для ежедневной смены обоев`nили "Обновить" для принудительного обновления.
            IniWrite, %Папка_новая%, %ini%, Настройки, Папка ; запись папки обоин
            IniWrite, %FirstFile%, %ini%, Настройки, Файл ; запись выбранного файла обоин
            }
        Else
            MsgBox, 48, Внимание!, Изображений не найдено!
        }
    Else
        MsgBox, 48, Внимание!, Выберите папку с изображениями!
Return
; --------------------- Проверка наличия изображений
ПроверкаНаличияИзображений(fold, ByRef FirstFile, ByRef nFile = 0)
    {
    global Форматы
    n = 0
    Loop, %fold%\*
        If A_LoopFileName contains %Форматы%
            {
            n +=1 ; подсчет кол-ва файлов допустимого формата
            if !FirstFile
                FirstFile := A_LoopFileName ; имя первого файла
            Else
                {
                If A_LoopFileName = %FirstFile%
                    nFile := n ; номер текущего файла
                }
            }
    Return n
    }
; --------------------- Смена обоев рабочего стола
Updater(fold = 0)
    {
    global ini, Title, Режимы
    IniRead, Папка, %ini%, Настройки, Папка, 0 ; чтение папки с изображениями
    IniRead, Файл, %ini%, Настройки, Файл, 0 ; чтение файла для смены обоев
    IniRead, Режим, %ini%, Настройки, Режим, 1 ; чтение режима обновления
    n := ПроверкаНаличияИзображений(Папка, Файл, nFile) ; подсчет кол-ва файлов
    НачатьСпервого = 0 ; метка будет "1", если текущий файл не найден
    StringSplit, тРежим, Режимы, | ; список режимов
    IfExist, %Папка%\%Файл% ; проверка наличия файла
        {
        TrayTip, % Title " " nFile " из " n " (" тРежим%Режим% ")", %Файл%, 1
        SetWallpaper(Папка "\" Файл, nStyle = 3) ; запуск смены обоев    
        Return ЦиклПоФайлам(Папка, Файл, n, 0)
        }
    Else ; файл не найден
        {
        IfExist, %Папка% ; проверка наличия папки изображений
            If ПроверкаНаличияИзображений(Папка, FirstFile) > 0 ; если изображения в папке есть
                Return ЦиклПоФайлам(Папка, Файл, n, 1) ; начать обновление обоев с первого файла
            Else
                MsgBox, 48, Внимание!, Изображения в папке не найдены!
        Else ; папка не найдена, показ окна программы
            {
            IfExist, %fold% ; если путь выбран, но не сохранен
                MsgBox, 48, Внимание!, Нажмите сохранить перед обновлением!
            Else
                MsgBox, 48, Внимание!, Папка с изображениями не найдена! Выберите новую папку!
            }
        }
    }
; --------------------- Цикл по файлам изображений
ЦиклПоФайлам(fold, fil, n, firs)    
    {
    global Форматы, Режим
    m = 0
    Следующий = 0
    If Режим = 3 ; режим "Случайно"
        Random, mR, 1, %n%
    Loop, %fold%\* ; перебор файлов
        {
        If A_LoopFileName contains %Форматы% ; если формат файла допустим
            {
            If A_Index = 1
                fFirst := A_LoopFileName ; присвоить имя первого файла (для режима Зациклить)
            m += 1 ; счетчик порядкового номера файла
            If mR = %m% ; цикл дошел до случайного файла
                Return ЗаписатьСледФайл(fold, A_LoopFileName)    
            If Режим <> 3 ; режим не "Случайно"
                If Следующий = %m% ; метка «Остановиться на следующем»
                    Return ЗаписатьСледФайл(fold, A_LoopFileName)
            Else
                {
                If firs = 1 ; обновление обоев с первого файла
                    {
                    SetWallpaper(fold "\" A_LoopFileName, nStyle = 3) ; запуск смены обоев    
                    Следующий := m + 1 ; номер файла для следующей смены обоев
                    ; Return "Закрыться" ; метка завершения программы
                    }
                Else
                    {
                    If fil = %A_LoopFileName% ; цикл дошел до текущего файла
                        {
                        If m = %n% ; если файл последний
                            {
                            If Режим = 1 ; режим "По порядку"
                                MsgBox, 48, Внимание!, Файл последний! Добавьте в папку новые файлы, или`nнажмите "Сохранить", чтобы начать сначала!
                            If Режим = 2 ; режим "Зациклить"
                                Return ЗаписатьСледФайл(fold, fFirst)
                            }
                        Следующий := m + 1 ; номер файла для следующей смены обоев
                        }
                    }
                }
            }        
        }
    }
; --------------------- Запись следующего файла в ini
ЗаписатьСледФайл(fold, fcur)
    {
    global ini
    IniWrite, %fcur%, %ini%, Настройки, Файл ; запись файла обоин для следующей смены обоев
    Return "Закрыться"
    }    
; --------------------- SetWallpaper (http://forum.script-coding.com/viewtopic.php?pid=44333#p44333)
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 в вашей системе!
         Return
      }
      if !pBitmap := Gdip_CreateBitmapFromFile(sWallpaperPath)
      {
         MsgBox, 48, Ошибка GDI+, Невозможно извлечь изображение из файла %sWallpaperPath%
         Gdip_Shutdown(pToken)
         Return
      }
      Gdip_SaveBitmapToFile(pBitmap, dFile)
      Gdip_DisposeImage(pBitmap)
      Gdip_Shutdown(pToken)
   }
   Else
        FileCopy, %sWallpaperPath%, %dFile%, 1
      ; FileMove, %sWallpaperPath%, %dFile%, 1
   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)
}
; --------------------- Закрыть окно 
ButtonЗакрыть:
GuiClose:
    ExitApp
#include, Gdip.ahk
Post's attachments

Обоина.rar 207.88 kb, 32 downloads since 2012-12-30 

You don't have the permssions to download the attachments of this post.