<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Автосмена обоев рабочего стола]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=7926</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=7926&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Автосмена обоев рабочего стола».]]></description>
		<lastBuildDate>Sat, 29 Dec 2012 08:41:44 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[AHK: Автосмена обоев рабочего стола]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=68017#p68017</link>
			<description><![CDATA[<p>Программа &quot;<strong>Обоина</strong>&quot; сменяет обои при загрузке компьютера.<br />Возможности:<br />Смена обоев по порядку, циклически, случайно, принудительно (кнопка &quot;Обновить&quot;)<br />Показ всплывающего окошка с информацией о файле и режиме.<br />Если файл для обоев последний (режим &quot;По порядку&quot;), будет загружен интерфейс программы.</p><p>1. Выбрать папку с изображениями<br />2. Выбрать режим смены<br />3. Сохранить данные<br />4. Включить авоматическую смену обоев (работает только при скомпилированном скрипте)</p><p>В аттаче скомпилированный файл.<br />Тестировалось на XP, 7<br />Требует подключения библиотеки Gdip (если уже подключена, необходимо удалить строку #include, Gdip.ahk)<br />Сама функция смены обоев рабочего стола взята <a href="http://forum.script-coding.com/viewtopic.php?pid=44333#p44333">здесь</a>.<br /></p><div class="codebox"><pre><code>; --------------------- Переменные
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 ? &quot;Выключить&quot; : &quot;Включить&quot;
If Update = 1  ; если обновление включено
    if 0 = 1 ; если запуск с ярлыка - обновить обои и закрыться
        {    
        If Updater() = &quot;Закрыться&quot;
            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 ? &quot;Включить&quot; : &quot;Выключить&quot;
    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 &gt;= 1
            {
            MsgBox, 64, Готово!, Всего изображений:  %n%`nНажмите &quot;Включить&quot; для ежедневной смены обоев`nили &quot;Обновить&quot; для принудительного обновления.
            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 ; метка будет &quot;1&quot;, если текущий файл не найден
    StringSplit, тРежим, Режимы, | ; список режимов
    IfExist, %Папка%\%Файл% ; проверка наличия файла
        {
        TrayTip, % Title &quot; &quot; nFile &quot; из &quot; n &quot; (&quot; тРежим%Режим% &quot;)&quot;, %Файл%, 1
        SetWallpaper(Папка &quot;\&quot; Файл, nStyle = 3) ; запуск смены обоев    
        Return ЦиклПоФайлам(Папка, Файл, n, 0)
        }
    Else ; файл не найден
        {
        IfExist, %Папка% ; проверка наличия папки изображений
            If ПроверкаНаличияИзображений(Папка, FirstFile) &gt; 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 ; режим &quot;Случайно&quot;
        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 Режим &lt;&gt; 3 ; режим не &quot;Случайно&quot;
                If Следующий = %m% ; метка «Остановиться на следующем»
                    Return ЗаписатьСледФайл(fold, A_LoopFileName)
            Else
                {
                If firs = 1 ; обновление обоев с первого файла
                    {
                    SetWallpaper(fold &quot;\&quot; A_LoopFileName, nStyle = 3) ; запуск смены обоев    
                    Следующий := m + 1 ; номер файла для следующей смены обоев
                    ; Return &quot;Закрыться&quot; ; метка завершения программы
                    }
                Else
                    {
                    If fil = %A_LoopFileName% ; цикл дошел до текущего файла
                        {
                        If m = %n% ; если файл последний
                            {
                            If Режим = 1 ; режим &quot;По порядку&quot;
                                MsgBox, 48, Внимание!, Файл последний! Добавьте в папку новые файлы, или`nнажмите &quot;Сохранить&quot;, чтобы начать сначала!
                            If Режим = 2 ; режим &quot;Зациклить&quot;
                                Return ЗаписатьСледФайл(fold, fFirst)
                            }
                        Следующий := m + 1 ; номер файла для следующей смены обоев
                        }
                    }
                }
            }        
        }
    }
; --------------------- Запись следующего файла в ini
ЗаписатьСледФайл(fold, fcur)
    {
    global ini
    IniWrite, %fcur%, %ini%, Настройки, Файл ; запись файла обоин для следующей смены обоев
    Return &quot;Закрыться&quot;
    }    
; --------------------- 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 &quot;\Wallpaper&quot;)
      FileCreateDir, %A_AppData%\Wallpaper
   dFile := A_AppData &quot;\Wallpaper\Wallpaper.bmp&quot;

   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(&quot;SystemParametersInfo&quot;, UInt, SPI_SETDESKWALLPAPER, UInt, 0
      , Str, dFile, UInt, SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE)
}
; --------------------- Закрыть окно 
ButtonЗакрыть:
GuiClose:
    ExitApp
#include, Gdip.ahk</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Zohann)]]></author>
			<pubDate>Sat, 29 Dec 2012 08:41:44 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=68017#p68017</guid>
		</item>
	</channel>
</rss>
