Тема: 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