1

Тема: AHK: Анимированная картинка «ожидание»

В продолжение темы «Эмуляция множественных потоков».

Иногда нужно показать пользователю, что скрипт ожидает какого-либо события, а не просто завис. Для такого случая можно воспользоваться анимированной картинкой. Предлагаю функцию Waiting(), создающую подобные изображения.

Каждое анимированное изображение запускается в отдельном процессе, и не загружает основной скрипт. Функция возвращает PID созданного процесса.

При корректном завершении процесса-родителя все созданные процессы также завершаются.

^1::Waiting() ; запуск по умолчанию для демонстрации

; запуск двух экземпляров одновременно с блокнотом, как окном-владельцем,
; картинки будут перемещаться вместе с окном блокнота.
; при закрытии окна-владельца процессы картинок завершатся.
^2::
   DetectHiddenWindows, On
   Run, notepad.exe,, hide, PID
   WinWait, ahk_pid %PID%
   WinMove,,, (A_ScreenWidth - 400)//2, 100, 400, 300
   WinShow
   hParent := WinExist()
   
   PID1 := Waiting("", 130, 160, 50, 11, 10, 0xCCFFBE00, 10, hParent)
   PID2 := Waiting("", 260, 160, 100, 22, 10, 0xCC5A5192, 6, hParent)
   return

^3::Waiting(PID2)   ; завершаем процесс с идентификатором PID2

; Прикольно :)
^4::Waiting("", A_ScreenWidth//2, A_ScreenHeight//2, d := A_ScreenHeight - 100, d//4, 10, 0xCCFFBE00, 5)

^Space::Waiting(0)  ; закрываем все созданные процессы, передавая в функцию 0

Esc::ExitApp
return

Waiting(PID="", x="", y="", Diameter=70, d=17, Number=9, Color=0xCC70A0D0, Speed=5, hParent="")
{
/*
PID — если пустое значение — запускается новый процесс,
           если числовое значекние — закрывается процесс с данным идентификатором
           если 0 — закрываются все процессы, запущенные функцией
x, y — координаты центра вращения, если в параметре hParent указан хэндл
           окна-владельца — считаются от его верхнего левого угла, иначе — относительно экрана
Diameter — общий диаметр изображения
d — диаметр элемента изображения
Number — количество элементов
Color — прозрачность и цвет изображения в формате 0xFFFFFFFF,
           где старший байт — прозрачность, остальные — цвет в RGB
Speed — скорость вращения изображения от 0 до 10
hParent — хэндл окна-владельца, если не указан, картинка будет AlwaysOnTop

Функция возвращает PID запущенного процесса.
*/

   static Waiting := new Waiting_Graphics
   (x = "") ? x := A_ScreenWidth//2
   (y = "") ? y := A_ScreenHeight//2
   if (PID = "")
      Return Waiting.RunScript(x, y, Diameter, d, Number, Color, Speed, hParent)
   else
      Waiting.TerminateScript(PID)
}

class Waiting_Graphics
{
   __New()
   {
      this.PIDs := []
   }
   
   __Delete()
   {
      for k,v in this.PIDs
         WinClose, % "ahk_pid" v
   }
   
   RunScript(x, y, Diameter, d, Number, Color, Speed, hWnd)
   {
      VarSetCapacity(TmpFilePath, MAX_PATH := 260)
      DllCall("GetTempFileName", Str, A_Temp, Str, "Wtg", UInt, 0, Ptr, &TmpFilePath)
      VarSetCapacity(TmpFilePath, -1)
      FileAppend, % this.GetScript(x, y, Diameter, d, Number, Color, Speed, hWnd), % TmpFilePath
      Run, % A_AhkPath " """ TmpFilePath """",,, PID
      DetectHiddenWindows, On
      WinWait, % "ahk_pid" PID
      FileDelete, % TmpFilePath
      this.PIDs.Insert(PID)
      Return PID
   }

   TerminateScript(PID)
   {
      if PID
      {
         PostMessage, DllCall("RegisterWindowMessage", Str, "WM_INFO"),,,, % "ahk_pid" PID
         for k,v in this.PIDs
            if (v = PID)
               this.PIDs.Remove(k)
      }
      else
      {
         for k,v in this.PIDs
            PostMessage, DllCall("RegisterWindowMessage", Str, "WM_INFO"),,,, % "ahk_pid" v
         this.PIDs := []
      }
   }

   GetScript(x, y, Diameter, d, Number, Color, Speed, hWnd)
   {
      Script =
      (
         #NoTrayIcon
         SetBatchLines, -1
         TimePeriod = 3
         DllCall("Winmm\timeBeginPeriod", UInt, TimePeriod) 
         OnExit, Exit
         
         x := %x%, y := %y%
         Color := %Color% & 0xFFFFFF
         _trans := %Color%>>24
         
         Number := %Number%
         Width := %Diameter%
         _Width := %d%
         dW := _Width/Number
         Speed := (%Speed% > 10 ? 10 : %Speed%)
         hParent := %hWnd%
         
         R := Width//2 - _Width//2
         xR := yR := Width//2
         pi := 3.141593

         ; WS_EX_LAYERED := 0x80000, WS_EX_TRANSPARENT := 0x20
         Gui, `% "-Caption +E0x80020 +hwndID +ToolWindow " (hParent ? "+Owner" hParent : "+AlwaysOnTop")
         Gui, Show, NA
         OnMessage(DllCall("RegisterWindowMessage", Str, "WM_INFO"), "WM_INFO_RECEIVER")

         pToken := GdipStartup()

         hbm := CreateDIBSection(Width+1, Width+1)
         hdc := CreateCompatibleDC()
         obm := SelectObject(hdc, hbm)
         G := GraphicsFromHDC(hdc)
         SetSmoothingMode(G, 4)

         i := 0, Angle := pi/2 - 2*pi/Number
         Time := Round(65 - Speed*(Speed < 8 ? 5 : 4.4))

         Loop
         {
            Angle += 2*pi/Number
            i := i < Number ? ++i : Number
            Loop 10
            {
               if ExitEvent
               {
                  _trans -= 4
                  if _trans <= 0
                     ExitApp
               }
               trans := _trans - (A_Index - 1)*2 + (dTrans := 20)
               Width_ := _Width - 0.1*dW*(A_Index - 1) + dW
               
               GraphicsClear(G)
               Loop `% i
               {
                  _Angle := Angle - (A_Index-1)*2*pi/Number
                  trans := (t := trans - dTrans) < 0 ? 0 : t
                  pBrush := BrushCreateSolid(trans<<24|Color)
                  if ( Width_ -= dW) > 0
                     FillEllipse(G, pBrush, Round(xR - Cos(_Angle)*R)- (Width_/2)
                        , Round(yR - Sin(_Angle)*R)- (Width_/2), Width_, Width_)
                  DllCall("gdiplus\GdipDeleteBrush", "ptr", pBrush)
               }
               
               if hParent
               {
                  WinGetPos, xp, yp,,, ahk_id `%hParent`%
                  if (xp = "")
                     ExitApp
                  _x := xp + x, _y := yp + y
               }
               else
                  _x := x, _y := y
               UpdateLayeredWindow(ID, hdc, _x-Width//2, _y-Width//2, Width+1, Width+1)
               DllCall("Sleep", UInt, Time//10)
            }
            if (Angle > pi*2)
               Angle -= pi*2
            DllCall("Sleep", UInt, Time)
         }
         return
         
         GuiClose:
            ExitApp

         Exit:
            SelectObject(hdc, obm), DllCall("DeleteObject", "ptr", hbm)
            DllCall("DeleteDC", "ptr", hdc), DllCall("gdiplus\GdipDeleteGraphics", "ptr", G)
            GdipShutdown(pToken), pToken := ""
            DllCall("Winmm\timeEndPeriod", UInt, TimePeriod)
            ExitApp
            
         WM_INFO_RECEIVER()
         {
            global ExitEvent := 1
         }
            
         GdipStartup()
         {
            if !DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
               DllCall("LoadLibrary", "str", "gdiplus")
            VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
            DllCall("gdiplus\GdiplusStartup", "uptr*", pToken, "ptr", &si, "ptr", 0)
            return pToken
         }

         GdipShutdown(pToken)
         {
            DllCall("gdiplus\GdiplusShutdown", "uptr", pToken)
            if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
               DllCall("FreeLibrary", "ptr", hModule)
            return 0
         }

         CreateDIBSection(w, h, hdc="", bpp=32, ByRef ppvBits=0)
         {
            hdc2 := hdc ? hdc : DllCall("GetDC", "ptr", 0, "ptr")
            VarSetCapacity(bi, 40, 0)
            NumPut(w, bi, 4, "uint"), NumPut(h, bi, 8, "uint"), NumPut(40, bi, 0, "uint")
               , NumPut(1, bi, 12, "ushort"), NumPut(0, bi, 16), NumPut(bpp, bi, 14, "ushort")
            hbm := DllCall("CreateDIBSection", "ptr" , hdc2, "ptr" , &bi
               , "uint" , 0, "ptr*", ppvBits, "ptr" , 0, "uint" , 0, "ptr")

            if !hdc
               DllCall("ReleaseDC", "ptr", 0, "ptr", hdc2)
            return hbm
         }

         CreateCompatibleDC(hdc=0)
         {
            return DllCall("CreateCompatibleDC", "ptr", hdc, "ptr")
         }

         SelectObject(hdc, hgdiobj)
         {
            return DllCall("SelectObject", "ptr", hdc, "ptr", hgdiobj, "ptr")
         }

         GraphicsFromHDC(hdc)
         {
             DllCall("gdiplus\GdipCreateFromHDC", "ptr", hdc, "ptr*", pGraphics)
             return pGraphics
         }

         SetSmoothingMode(pGraphics, SmoothingMode)
         {
            return DllCall("gdiplus\GdipSetSmoothingMode", "ptr", pGraphics, "int", SmoothingMode)
         }

         GraphicsClear(pGraphics, ARGB=0x00ffffff)
         {
             return DllCall("gdiplus\GdipGraphicsClear", "ptr", pGraphics, "uint", ARGB)
         }

         BrushCreateSolid(ARGB=0xff000000)
         {
            DllCall("gdiplus\GdipCreateSolidFill", "uint", ARGB, "ptr*", pBrush)
            return pBrush
         }

         FillEllipse(pGraphics, pBrush, x, y, w, h)
         {
            return DllCall("gdiplus\GdipFillEllipse", "ptr", pGraphics, "ptr", pBrush, "float", x, "float", y, "float", w, "float", h)
         }

         UpdateLayeredWindow(hwnd, hdc, x="", y="", w="", h="", Alpha=255)
         {
            if ((x != "") && (y != ""))
               VarSetCapacity(pt, 8), NumPut(x, pt, 0, "uint"), NumPut(y, pt, 4, "uint")

            if (w = "") ||(h = "")
               WinGetPos,,, w, h, ahk_id `%hwnd`%
            
            return DllCall("UpdateLayeredWindow", "ptr", hwnd, "ptr", 0, "ptr", ((x = "") && (y = "")) ? 0 : &pt
            , "int64*", w|h<<32, "ptr", hdc, "int64*", 0, "uint", 0, "uint*", Alpha<<16|1<<24, "uint", 2)
         }
      )
      return Script
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

2

Re: AHK: Анимированная картинка «ожидание»

Классно! С таким способом можно вывести использование скриптов на новый уровень.
Например, есть идея запустить 4 потока, ожидающих сообщения с координатами, и чтоб каждый из 4х потоков производил PixelSearch в отведенной ему области экрана, и в случае нахождения возвращал бы координаты родителю.

Про приведенный выше пример хочу заметить,  что при всей красоте примера, анимированная картинка не гарантирует, что родитель не создал потомка и после этого благополучно не завис, так ведь?
Для уверенности в работе родителя можно поставить таймер, и посылать сообщения потомкам с неким интервалом. Если сообщения не будет, то потомок останавливает анимацию и ждет сообщения. Ну это так, мои придирки ))

3

Re: AHK: Анимированная картинка «ожидание»

Irbis пишет:

Для уверенности в работе родителя можно поставить таймер, и посылать сообщения потомкам с неким интервалом.

Это несложно. В таком варианте, если основной скрипт завис (чего можно добиться, вызвав контекстное меню его иконки в трее), изображения через пару секунд тоже "зависнут", ожидая, пока основной скрипт "отвиснет":

^1::Waiting() ; запуск по умолчанию для демонстрации

; запуск двух экземпляров одновременно с блокнотом, как окном-владельцем,
; картинки будут перемещаться вместе с окном блокнота.
; при закрытии окна-владельца процессы картинок завершатся.
^2::
   DetectHiddenWindows, On
   Run, notepad.exe,, hide, PID
   WinWait, ahk_pid %PID%
   WinMove,,, (A_ScreenWidth - 400)//2, 100, 400, 300
   WinShow
   hParent := WinExist()
   
   PID1 := Waiting("", 130, 160, 50, 11, 10, 0xCCFFBE00, 10, hParent)
   PID2 := Waiting("", 260, 160, 100, 22, 10, 0xCC5A5192, 6, hParent)
   return

^3::Waiting(PID2)   ; завершаем процесс с идентификатором PID2

; Прикольно :)
^4::Waiting("", A_ScreenWidth//2, A_ScreenHeight//2, d := A_ScreenHeight - 100, d//4, 10, 0xCCFFBE00, 5)

^Space::Waiting(0)  ; закрываем все созданные процессы, передавая в функцию 0

Esc::ExitApp
return

Waiting(PID="", x="", y="", Diameter=70, d=17, Number=9, Color=0xCC70A0D0, Speed=5, hParent="")
{
/*
PID — если пустое значение — запускается новый процесс,
           если числовое значение — закрывается процесс с данным идентификатором
           если 0 — закрываются все процессы, запущенные функцией
x, y — координаты центра вращения, если в параметре hParent указан хэндл
           окна-владельца — считаются от его верхнего левого угла, иначе — относительно экрана
Diameter — общий диаметр изображения
d — диаметр элемента изображения
Number — количество элементов
Color — прозрачность и цвет изображения в формате 0xFFFFFFFF,
           где старший байт — прозрачность, остальные — цвет в RGB
Speed — скорость вращения изображения от 0 до 10
hParent — хэндл окна-владельца, если не указан, картинка будет AlwaysOnTop

Функция возвращает PID запущенного процесса.
*/

   static Waiting := new Waiting_Graphics
   (x = "") ? x := A_ScreenWidth//2
   (y = "") ? y := A_ScreenHeight//2
   if (PID = "")
   {
      NewPID := Waiting.RunScript(x, y, Diameter, d, Number, Color, Speed, hParent)
      SetTimer, ControlTimer, 1000
      Return NewPID
   }
   else
      Waiting.TerminateScript(PID)
   return
   
ControlTimer:
   if !Waiting.PIDs.1
      SetTimer, ControlTimer, Off
   
   Waiting.ControlScript()
   return
}

class Waiting_Graphics
{
   __New()
   {
      this.PIDs := []
      this.WM_INFO := DllCall("RegisterWindowMessage", Str, "WM_INFO")
   }
   
   __Delete()
   {
      for k,v in this.PIDs
         WinClose, % "ahk_pid" v
   }
   
   RunScript(x, y, Diameter, d, Number, Color, Speed, hWnd)
   {
      VarSetCapacity(TmpFilePath, MAX_PATH := 260)
      DllCall("GetTempFileName", Str, A_Temp, Str, "Wtg", UInt, 0, Ptr, &TmpFilePath)
      VarSetCapacity(TmpFilePath, -1)
      FileAppend, % this.GetScript(x, y, Diameter, d, Number, Color, Speed, hWnd), % TmpFilePath
      Run, % A_AhkPath " """ TmpFilePath """",,, PID
      DetectHiddenWindows, On
      WinWait, % "ahk_pid" PID
      FileDelete, % TmpFilePath
      this.PIDs.Insert(PID)
      Return PID
   }
   
   ControlScript()
   {
      for k,v in this.PIDs
         PostMessage, this.WM_INFO, 1,,, % "ahk_pid" v
   }

   TerminateScript(PID)
   {
      if PID
      {
         PostMessage, this.WM_INFO,,,, % "ahk_pid" PID
         for k,v in this.PIDs
            if (v = PID)
               this.PIDs.Remove(k)
      }
      else
      {
         for k,v in this.PIDs
            PostMessage, this.WM_INFO,,,, % "ahk_pid" v
         this.PIDs := []
      }
   }

   GetScript(x, y, Diameter, d, Number, Color, Speed, hWnd)
   {
      Script =
      (
         #NoTrayIcon
         SetBatchLines, -1
         TimePeriod = 3
         waiting := A_TickCount
         DllCall("Winmm\timeBeginPeriod", UInt, TimePeriod) 
         OnExit, Exit
         
         x := %x%, y := %y%
         Color := %Color% & 0xFFFFFF
         _trans := %Color%>>24
         
         Number := %Number%
         Width := %Diameter%
         _Width := %d%
         dW := _Width/Number
         Speed := (%Speed% > 10 ? 10 : %Speed%)
         hParent := %hWnd%
         
         R := Width//2 - _Width//2
         xR := yR := Width//2
         pi := 3.141593

         ; WS_EX_LAYERED := 0x80000, WS_EX_TRANSPARENT := 0x20
         Gui, `% "-Caption +E0x80020 +hwndID +ToolWindow " (hParent ? "+Owner" hParent : "+AlwaysOnTop")
         Gui, Show, NA
         OnMessage(DllCall("RegisterWindowMessage", Str, "WM_INFO"), "WM_INFO_RECEIVER")

         pToken := GdipStartup()

         hbm := CreateDIBSection(Width+1, Width+1)
         hdc := CreateCompatibleDC()
         obm := SelectObject(hdc, hbm)
         G := GraphicsFromHDC(hdc)
         SetSmoothingMode(G, 4)

         i := 0, Angle := pi/2 - 2*pi/Number
         Time := Round(65 - Speed*(Speed < 8 ? 5 : 4.4))

         Loop
         {
            if (A_TickCount - waiting > 2000)
            {
               Sleep, 300
               continue
            }
            
            Angle += 2*pi/Number
            i := i < Number ? ++i : Number
            Loop 10
            {
               if ExitEvent
               {
                  _trans -= 2
                  if _trans <= 0
                     ExitApp
               }
               trans := _trans - (A_Index - 1)*2 + (dTrans := 20)
               Width_ := _Width - 0.1*dW*(A_Index - 1) + dW
               
               GraphicsClear(G)
               Loop `% i
               {
                  _Angle := Angle - (A_Index-1)*2*pi/Number
                  trans := (t := trans - dTrans) < 0 ? 0 : t
                  pBrush := BrushCreateSolid(trans<<24|Color)
                  if ( Width_ -= dW) > 0
                     FillEllipse(G, pBrush, Round(xR - Cos(_Angle)*R)- (Width_/2)
                        , Round(yR - Sin(_Angle)*R)- (Width_/2), Width_, Width_)
                  DllCall("gdiplus\GdipDeleteBrush", "ptr", pBrush)
               }
               
               if hParent
               {
                  WinGetPos, xp, yp,,, ahk_id `%hParent`%
                  if (xp = "")
                     ExitApp
                  _x := xp + x, _y := yp + y
               }
               else
                  _x := x, _y := y
               UpdateLayeredWindow(ID, hdc, _x-Width//2, _y-Width//2, Width+1, Width+1)
               DllCall("Sleep", UInt, Time//10)
            }
            if (Angle > pi*2)
               Angle -= pi*2
            DllCall("Sleep", UInt, Time)
         }
         return
         
         GuiClose:
            ExitApp

         Exit:
            SelectObject(hdc, obm), DllCall("DeleteObject", "ptr", hbm)
            DllCall("DeleteDC", "ptr", hdc), DllCall("gdiplus\GdipDeleteGraphics", "ptr", G)
            GdipShutdown(pToken), pToken := ""
            DllCall("Winmm\timeEndPeriod", UInt, TimePeriod)
            ExitApp
            
         WM_INFO_RECEIVER(wp)
         {
            global ExitEvent, waiting
            if !wp
               ExitEvent := 1
            else
               waiting := A_TickCount
         }
            
         GdipStartup()
         {
            if !DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
               DllCall("LoadLibrary", "str", "gdiplus")
            VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
            DllCall("gdiplus\GdiplusStartup", "uptr*", pToken, "ptr", &si, "ptr", 0)
            return pToken
         }

         GdipShutdown(pToken)
         {
            DllCall("gdiplus\GdiplusShutdown", "uptr", pToken)
            if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
               DllCall("FreeLibrary", "ptr", hModule)
            return 0
         }

         CreateDIBSection(w, h, hdc="", bpp=32, ByRef ppvBits=0)
         {
            hdc2 := hdc ? hdc : DllCall("GetDC", "ptr", 0, "ptr")
            VarSetCapacity(bi, 40, 0)
            NumPut(w, bi, 4, "uint"), NumPut(h, bi, 8, "uint"), NumPut(40, bi, 0, "uint")
               , NumPut(1, bi, 12, "ushort"), NumPut(0, bi, 16), NumPut(bpp, bi, 14, "ushort")
            hbm := DllCall("CreateDIBSection", "ptr" , hdc2, "ptr" , &bi
               , "uint" , 0, "ptr*", ppvBits, "ptr" , 0, "uint" , 0, "ptr")

            if !hdc
               DllCall("ReleaseDC", "ptr", 0, "ptr", hdc2)
            return hbm
         }

         CreateCompatibleDC(hdc=0)
         {
            return DllCall("CreateCompatibleDC", "ptr", hdc, "ptr")
         }

         SelectObject(hdc, hgdiobj)
         {
            return DllCall("SelectObject", "ptr", hdc, "ptr", hgdiobj, "ptr")
         }

         GraphicsFromHDC(hdc)
         {
             DllCall("gdiplus\GdipCreateFromHDC", "ptr", hdc, "ptr*", pGraphics)
             return pGraphics
         }

         SetSmoothingMode(pGraphics, SmoothingMode)
         {
            return DllCall("gdiplus\GdipSetSmoothingMode", "ptr", pGraphics, "int", SmoothingMode)
         }

         GraphicsClear(pGraphics, ARGB=0x00ffffff)
         {
             return DllCall("gdiplus\GdipGraphicsClear", "ptr", pGraphics, "uint", ARGB)
         }

         BrushCreateSolid(ARGB=0xff000000)
         {
            DllCall("gdiplus\GdipCreateSolidFill", "uint", ARGB, "ptr*", pBrush)
            return pBrush
         }

         FillEllipse(pGraphics, pBrush, x, y, w, h)
         {
            return DllCall("gdiplus\GdipFillEllipse", "ptr", pGraphics, "ptr", pBrush, "float", x, "float", y, "float", w, "float", h)
         }

         UpdateLayeredWindow(hwnd, hdc, x="", y="", w="", h="", Alpha=255)
         {
            if ((x != "") && (y != ""))
               VarSetCapacity(pt, 8), NumPut(x, pt, 0, "uint"), NumPut(y, pt, 4, "uint")

            if (w = "") ||(h = "")
               WinGetPos,,, w, h, ahk_id `%hwnd`%
            
            return DllCall("UpdateLayeredWindow", "ptr", hwnd, "ptr", 0, "ptr", ((x = "") && (y = "")) ? 0 : &pt
            , "int64*", w|h<<32, "ptr", hdc, "int64*", 0, "uint", 0, "uint*", Alpha<<16|1<<24, "uint", 2)
         }
      )
      return Script
   }
}
Irbis пишет:

Например, есть идея запустить 4 потока, ожидающих сообщения с координатами, и чтоб каждый из 4х потоков производил PixelSearch в отведенной ему области экрана, и в случае нахождения возвращал бы координаты родителю.

Да, хороший повод для применения многопоточности, если нужна скорость. Попробуй реализовать. Потом сделаем пост в Коллекции.

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

4 (изменено: Zanoza, 2013-12-28 04:59:16)

Re: AHK: Анимированная картинка «ожидание»

Скажите почему не работает на некоторых компьютерах.
Я 4 протестировал.
На всех установлена ос Win7  , на трех 32 bit - одна 64 bit.
64 bit - не работает .
32 bit - работает на двух машинах.
Почему , может не хватает некоторых библиотек?
(Скрипт был скомпилирован с разными параметрами)
AHK v  1.1.13.01 (unicode - 32 bit)
Ошибка такого рода:http://forum.script-coding.com/misc.php?action=pun_attachment&amp;item=616&amp;download=1&amp;secure_str=26155t8609

Win10 x64

5

Re: AHK: Анимированная картинка «ожидание»

Попробуйте так (заодно баг один исправлен):

/*
;            Пример использования
            
^1::Waiting() ; запуск по умолчанию для демонстрации

; запуск двух экземпляров одновременно с блокнотом, как окном-владельцем,
; картинки будут перемещаться вместе с окном блокнота.
; при закрытии окна-владельца процессы картинок завершатся.
^2::
   DetectHiddenWindows, On
   Run, notepad.exe,, hide, PID
   WinWait, ahk_pid %PID%
   WinMove,,, (A_ScreenWidth - 400)//2, 100, 400, 300
   WinShow
   hParent := WinExist()
   
   PID1 := Waiting("", 130, 160, 50, 11, 10, 0xCCFFBE00, 10, hParent)
   PID2 := Waiting("", 260, 160, 100, 22, 10, 0xCC5A5192, 6, hParent)
   return

^3::Waiting(PID2)   ; завершаем процесс с идентификатором PID2

; Прикольно :)
^4::Waiting("", A_ScreenWidth//2, A_ScreenHeight//2, d := A_ScreenHeight - 100, d//4, 10, 0xCCFFBE00, 5)

^Space::Waiting(0)  ; закрываем все созданные процессы, передавая в функцию 0

Esc::ExitApp
return
*/

Waiting(PID="", x="", y="", Diameter=70, d=17, Number=9, Color=0xCC70A0D0, Speed=5, hParent="")
{
/*
PID — если пустое значение — запускается новый процесс,
           если числовое значекние — закрывается процесс с данным идентификатором
           если 0 — закрываются все процессы, запущенные функцией
x, y — координаты центра вращения, если в параметре hParent указан хэндл
           окна-владельца — считаются от его верхнего левого угла, иначе — относительно экрана
Diameter — общий диаметр изображения
d — диаметр элемента изображения
Number — количество элементов
Color — прозрачность и цвет изображения в формате 0xFFFFFFFF,
           где старший байт — прозрачность, остальные — цвет в RGB
Speed — скорость вращения изображения от 0 до 10
hParent — хэндл окна-владельца, если не указан, картинка будет AlwaysOnTop

Функция возвращает PID запущенного процесса.
*/

   static Waiting := new Waiting_Graphics
   (x = "") ? x := A_ScreenWidth//2
   (y = "") ? y := A_ScreenHeight//2
   if (PID = "")
      Return Waiting.RunScript(x, y, Diameter, d, Number, Color, Speed, hParent)
   else
      Waiting.TerminateScript(PID)
}

class Waiting_Graphics
{
   __New()
   {
      this.PIDs := []
   }
   
   __Delete()
   {
      for k,v in this.PIDs
         this.PostMessageToMainWindow(v)
   }
   
   RunScript(x, y, Diameter, d, Number, Color, Speed, hWnd)
   {
      VarSetCapacity(TmpFilePath, (MAX_PATH := 260)*(A_IsUnicode ? 2 : 1))
      DllCall("GetTempFileName" . (A_IsUnicode ? "W" : "A"), Str, A_Temp, Str, "Wtg", UInt, 0, Ptr, &TmpFilePath)
      VarSetCapacity(TmpFilePath, -1)
      FileAppend, % this.GetScript(x, y, Diameter, d, Number, Color, Speed, hWnd), % TmpFilePath
      Run, % A_AhkPath " """ TmpFilePath """",,, PID
      DetectHiddenWindows, On
      WinWait, % "ahk_pid" PID
      FileDelete, % TmpFilePath
      this.PIDs.Insert(PID)
      Return PID
   }

   TerminateScript(PID)
   {
      if PID
      {
         this.PostMessageToMainWindow(PID)
         for k,v in this.PIDs
            if (v = PID)
               this.PIDs.Remove(k)
      }
      else
      {
         for k,v in this.PIDs
            this.PostMessageToMainWindow(v)
         this.PIDs := []
      }
   }
   
   PostMessageToMainWindow(PID)
   {
      DetectHiddenWindows, On
      SetTitleMatchMode, 2
      PostMessage, DllCall("RegisterWindowMessage", Str, "WM_INFO"),,,, % "AutoHotkey ahk_pid " PID
   }

   GetScript(x, y, Diameter, d, Number, Color, Speed, hWnd)
   {
      Script =
      (
         #NoTrayIcon
         SetBatchLines, -1
         TimePeriod = 3
         DllCall("Winmm\timeBeginPeriod", UInt, TimePeriod) 
         OnExit, Exit
         
         x := %x%, y := %y%
         Color := %Color% & 0xFFFFFF
         _trans := %Color%>>24
         
         Number := %Number%
         Width := %Diameter%
         _Width := %d%
         dW := _Width/Number
         Speed := (%Speed% > 10 ? 10 : %Speed%)
         hParent := %hWnd%
         
         R := Width//2 - _Width//2
         xR := yR := Width//2
         pi := 3.141593

         ; WS_EX_LAYERED := 0x80000, WS_EX_TRANSPARENT := 0x20
         Gui, `% "-Caption +E0x80020 +hwndID +ToolWindow " (hParent ? "+Owner" hParent : "+AlwaysOnTop")
         Gui, Show, NA
         OnMessage(DllCall("RegisterWindowMessage", Str, "WM_INFO"), "WM_INFO_RECEIVER")

         pToken := GdipStartup()

         hbm := CreateDIBSection(Width+1, Width+1)
         hdc := CreateCompatibleDC()
         obm := SelectObject(hdc, hbm)
         G := GraphicsFromHDC(hdc)
         SetSmoothingMode(G, 4)

         i := 0, Angle := pi/2 - 2*pi/Number
         Time := Round(65 - Speed*(Speed < 8 ? 5 : 4.4))

         Loop
         {
            Angle += 2*pi/Number
            i := i < Number ? ++i : Number
            Loop 10
            {
               trans := _trans - (A_Index - 1)*2 + (dTrans := 20)
               Width_ := _Width - 0.1*dW*(A_Index - 1) + dW
               
               GraphicsClear(G)
               Loop `% i
               {
                  _Angle := Angle - (A_Index-1)*2*pi/Number
                  trans := (t := trans - dTrans) < 0 ? 0 : t
                  pBrush := BrushCreateSolid(trans<<24|Color)
                  if ( Width_ -= dW) > 0
                     FillEllipse(G, pBrush, Round(xR - Cos(_Angle)*R)- (Width_/2)
                        , Round(yR - Sin(_Angle)*R)- (Width_/2), Width_, Width_)
                  DllCall("gdiplus\GdipDeleteBrush", "ptr", pBrush)
               }
               
               if hParent
               {
                  WinGetPos, xp, yp,,, ahk_id `%hParent`%
                  if (xp = "")
                     ExitApp
                  _x := xp + x, _y := yp + y
               }
               else
                  _x := x, _y := y
               UpdateLayeredWindow(ID, hdc, _x-Width//2, _y-Width//2, Width+1, Width+1)
               DllCall("Sleep", UInt, Time//10)
            }
            if (Angle > pi*2)
               Angle -= pi*2
            DllCall("Sleep", UInt, Time)
         }
         return
         
         GuiClose:
            ExitApp

         Exit:
            SelectObject(hdc, obm), DllCall("DeleteObject", "ptr", hbm)
            DllCall("DeleteDC", "ptr", hdc), DllCall("gdiplus\GdipDeleteGraphics", "ptr", G)
            GdipShutdown(pToken), pToken := ""
            DllCall("Winmm\timeEndPeriod", UInt, TimePeriod)
            ExitApp
            
         WM_INFO_RECEIVER()
         {
            ExitApp
         }
            
         GdipStartup()
         {
            if !DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
               DllCall("LoadLibrary", "str", "gdiplus")
            VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
            DllCall("gdiplus\GdiplusStartup", "uptr*", pToken, "ptr", &si, "ptr", 0)
            return pToken
         }

         GdipShutdown(pToken)
         {
            DllCall("gdiplus\GdiplusShutdown", "uptr", pToken)
            if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
               DllCall("FreeLibrary", "ptr", hModule)
            return 0
         }

         CreateDIBSection(w, h, bpp=32, ByRef ppvBits=0)
         {
            hdc := DllCall("GetDC", "ptr", 0, "ptr")
            VarSetCapacity(bi, 40, 0)
            NumPut(w, bi, 4, "uint"), NumPut(h, bi, 8, "uint"), NumPut(40, bi, 0, "uint")
               , NumPut(1, bi, 12, "ushort"), NumPut(0, bi, 16), NumPut(bpp, bi, 14, "ushort")
            hbm := DllCall("CreateDIBSection", "ptr" , hdc, "ptr" , &bi
               , "uint" , 0, "ptr*", ppvBits, "ptr" , 0, "uint" , 0, "ptr")

            DllCall("ReleaseDC", "ptr", 0, "ptr", hdc)
            return hbm
         }

         CreateCompatibleDC(hdc=0)
         {
            return DllCall("CreateCompatibleDC", "ptr", hdc, "ptr")
         }

         SelectObject(hdc, hgdiobj)
         {
            return DllCall("SelectObject", "ptr", hdc, "ptr", hgdiobj, "ptr")
         }

         GraphicsFromHDC(hdc)
         {
             DllCall("gdiplus\GdipCreateFromHDC", "ptr", hdc, "ptr*", pGraphics)
             return pGraphics
         }

         SetSmoothingMode(pGraphics, SmoothingMode)
         {
            return DllCall("gdiplus\GdipSetSmoothingMode", "ptr", pGraphics, "int", SmoothingMode)
         }

         GraphicsClear(pGraphics, ARGB=0x00ffffff)
         {
             return DllCall("gdiplus\GdipGraphicsClear", "ptr", pGraphics, "uint", ARGB)
         }

         BrushCreateSolid(ARGB=0xff000000)
         {
            DllCall("gdiplus\GdipCreateSolidFill", "uint", ARGB, "ptr*", pBrush)
            return pBrush
         }

         FillEllipse(pGraphics, pBrush, x, y, w, h)
         {
            return DllCall("gdiplus\GdipFillEllipse", "ptr", pGraphics, "ptr", pBrush, "float", x, "float", y, "float", w, "float", h)
         }

         UpdateLayeredWindow(hwnd, hdc, x="", y="", w="", h="", Alpha=255)
         {
            if ((x != "") && (y != ""))
               VarSetCapacity(pt, 8), NumPut(x, pt, 0, "uint"), NumPut(y, pt, 4, "uint")

            if (w = "") ||(h = "")
               WinGetPos,,, w, h, ahk_id `%hwnd`%
            
            return DllCall("UpdateLayeredWindow", "ptr", hwnd, "ptr", 0, "ptr", ((x = "") && (y = "")) ? 0 : &pt
            , "int64*", w|h<<32, "ptr", hdc, "int64*", 0, "uint", 0, "uint*", Alpha<<16|1<<24, "uint", 2)
         }
      )
      return Script
   }
}

И, конечно, на компьютере, где запускается скрипт, независимо от того, скомпилирован он, или нет, должен быть установлен AHK. Либо нужно прикреплять AutoHotkey.exe с помощью FileInstall и вместо A_AhkPath подставлять путь к нему.

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

6 (изменено: Zanoza, 2014-01-07 08:37:37)

Re: AHK: Анимированная картинка «ожидание»

>>>  с помощью FileInstall и вместо A_AhkPath подставлять путь к нему.
Не могу понять как задать путь ?
Подскажите пожалуйста

Win10 x64

7

Re: AHK: Анимированная картинка «ожидание»

Если планируется запускать скрипт на машинах, где AHK не установлен, нужно добавить в секцию автовыполнения команду

FileInstall, AutoHotkeyU32.exe, %A_ScriptDir%\AutoHotkey.exe, 0

и этом случае такой вариант функции использовать:

/*
;            Пример использования
            
^1::Waiting() ; запуск по умолчанию для демонстрации

; запуск двух экземпляров одновременно с блокнотом, как окном-владельцем,
; картинки будут перемещаться вместе с окном блокнота.
; при закрытии окна-владельца процессы картинок завершатся.
^2::
   DetectHiddenWindows, On
   Run, notepad.exe,, hide, PID
   WinWait, ahk_pid %PID%
   WinMove,,, (A_ScreenWidth - 400)//2, 100, 400, 300
   WinShow
   hParent := WinExist()
   
   PID1 := Waiting("", 130, 160, 50, 11, 10, 0xCCFFBE00, 10, hParent)
   PID2 := Waiting("", 260, 160, 100, 22, 10, 0xCC5A5192, 6, hParent)
   return

^3::Waiting(PID2)   ; завершаем процесс с идентификатором PID2

; Прикольно :)
^4::Waiting("", A_ScreenWidth//2, A_ScreenHeight//2, d := A_ScreenHeight - 100, d//4, 10, 0xCCFFBE00, 5)

^Space::Waiting(0)  ; закрываем все созданные процессы, передавая в функцию 0

Esc::ExitApp
return
*/

Waiting(PID="", x="", y="", Diameter=70, d=17, Number=9, Color=0xCC70A0D0, Speed=5, hParent="")
{
/*
PID — если пустое значение — запускается новый процесс,
           если числовое значекние — закрывается процесс с данным идентификатором
           если 0 — закрываются все процессы, запущенные функцией
x, y — координаты центра вращения, если в параметре hParent указан хэндл
           окна-владельца — считаются от его верхнего левого угла, иначе — относительно экрана
Diameter — общий диаметр изображения
d — диаметр элемента изображения
Number — количество элементов
Color — прозрачность и цвет изображения в формате 0xFFFFFFFF,
           где старший байт — прозрачность, остальные — цвет в RGB
Speed — скорость вращения изображения от 0 до 10
hParent — хэндл окна-владельца, если не указан, картинка будет AlwaysOnTop

Функция возвращает PID запущенного процесса.
*/

   static Waiting := new Waiting_Graphics
   (x = "") ? x := A_ScreenWidth//2
   (y = "") ? y := A_ScreenHeight//2
   if (PID = "")
      Return Waiting.RunScript(x, y, Diameter, d, Number, Color, Speed, hParent)
   else
      Waiting.TerminateScript(PID)
}

class Waiting_Graphics
{
   __New()
   {
      this.PIDs := []
   }
   
   __Delete()
   {
      for k,v in this.PIDs
         this.PostMessageToMainWindow(v)
   }
   
   RunScript(x, y, Diameter, d, Number, Color, Speed, hWnd)
   {
      VarSetCapacity(TmpFilePath, (MAX_PATH := 260)*(A_IsUnicode ? 2 : 1))
      DllCall("GetTempFileName" . (A_IsUnicode ? "W" : "A"), Str, A_Temp, Str, "Wtg", UInt, 0, Ptr, &TmpFilePath)
      VarSetCapacity(TmpFilePath, -1)
      FileAppend, % this.GetScript(x, y, Diameter, d, Number, Color, Speed, hWnd), % TmpFilePath
      Run, % (A_AhkPath ? A_AhkPath : A_ScriptDir . "\AutoHotkey.exe") . " """ . TmpFilePath . """",,, PID
      DetectHiddenWindows, On
      WinWait, % "ahk_pid" PID
      FileDelete, % TmpFilePath
      this.PIDs.Insert(PID)
      Return PID
   }

   TerminateScript(PID)
   {
      if PID
      {
         this.PostMessageToMainWindow(PID)
         for k,v in this.PIDs
            if (v = PID)
               this.PIDs.Remove(k)
      }
      else
      {
         for k,v in this.PIDs
            this.PostMessageToMainWindow(v)
         this.PIDs := []
      }
   }
   
   PostMessageToMainWindow(PID)
   {
      DetectHiddenWindows, On
      SetTitleMatchMode, 2
      PostMessage, DllCall("RegisterWindowMessage", Str, "WM_INFO"),,,, % "AutoHotkey ahk_pid " PID
   }

   GetScript(x, y, Diameter, d, Number, Color, Speed, hWnd)
   {
      Script =
      (
         #NoTrayIcon
         SetBatchLines, -1
         TimePeriod = 3
         DllCall("Winmm\timeBeginPeriod", UInt, TimePeriod) 
         OnExit, Exit
         
         x := %x%, y := %y%
         Color := %Color% & 0xFFFFFF
         _trans := %Color%>>24
         
         Number := %Number%
         Width := %Diameter%
         _Width := %d%
         dW := _Width/Number
         Speed := (%Speed% > 10 ? 10 : %Speed%)
         hParent := %hWnd%
         
         R := Width//2 - _Width//2
         xR := yR := Width//2
         pi := 3.141593

         ; WS_EX_LAYERED := 0x80000, WS_EX_TRANSPARENT := 0x20
         Gui, `% "-Caption +E0x80020 +hwndID +ToolWindow " (hParent ? "+Owner" hParent : "+AlwaysOnTop")
         Gui, Show, NA
         OnMessage(DllCall("RegisterWindowMessage", Str, "WM_INFO"), "WM_INFO_RECEIVER")

         pToken := GdipStartup()

         hbm := CreateDIBSection(Width+1, Width+1)
         hdc := CreateCompatibleDC()
         obm := SelectObject(hdc, hbm)
         G := GraphicsFromHDC(hdc)
         SetSmoothingMode(G, 4)

         i := 0, Angle := pi/2 - 2*pi/Number
         Time := Round(65 - Speed*(Speed < 8 ? 5 : 4.4))

         Loop
         {
            Angle += 2*pi/Number
            i := i < Number ? ++i : Number
            Loop 10
            {
               trans := _trans - (A_Index - 1)*2 + (dTrans := 20)
               Width_ := _Width - 0.1*dW*(A_Index - 1) + dW
               
               GraphicsClear(G)
               Loop `% i
               {
                  _Angle := Angle - (A_Index-1)*2*pi/Number
                  trans := (t := trans - dTrans) < 0 ? 0 : t
                  pBrush := BrushCreateSolid(trans<<24|Color)
                  if ( Width_ -= dW) > 0
                     FillEllipse(G, pBrush, Round(xR - Cos(_Angle)*R)- (Width_/2)
                        , Round(yR - Sin(_Angle)*R)- (Width_/2), Width_, Width_)
                  DllCall("gdiplus\GdipDeleteBrush", "ptr", pBrush)
               }
               
               if hParent
               {
                  WinGetPos, xp, yp,,, ahk_id `%hParent`%
                  if (xp = "")
                     ExitApp
                  _x := xp + x, _y := yp + y
               }
               else
                  _x := x, _y := y
               UpdateLayeredWindow(ID, hdc, _x-Width//2, _y-Width//2, Width+1, Width+1)
               DllCall("Sleep", UInt, Time//10)
            }
            if (Angle > pi*2)
               Angle -= pi*2
            DllCall("Sleep", UInt, Time)
         }
         return
         
         GuiClose:
            ExitApp

         Exit:
            SelectObject(hdc, obm), DllCall("DeleteObject", "ptr", hbm)
            DllCall("DeleteDC", "ptr", hdc), DllCall("gdiplus\GdipDeleteGraphics", "ptr", G)
            GdipShutdown(pToken), pToken := ""
            DllCall("Winmm\timeEndPeriod", UInt, TimePeriod)
            ExitApp
            
         WM_INFO_RECEIVER()
         {
            ExitApp
         }
            
         GdipStartup()
         {
            if !DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
               DllCall("LoadLibrary", "str", "gdiplus")
            VarSetCapacity(si, A_PtrSize = 8 ? 24 : 16, 0), si := Chr(1)
            DllCall("gdiplus\GdiplusStartup", "uptr*", pToken, "ptr", &si, "ptr", 0)
            return pToken
         }

         GdipShutdown(pToken)
         {
            DllCall("gdiplus\GdiplusShutdown", "uptr", pToken)
            if hModule := DllCall("GetModuleHandle", "str", "gdiplus", "ptr")
               DllCall("FreeLibrary", "ptr", hModule)
            return 0
         }

         CreateDIBSection(w, h, bpp=32, ByRef ppvBits=0)
         {
            hdc := DllCall("GetDC", "ptr", 0, "ptr")
            VarSetCapacity(bi, 40, 0)
            NumPut(w, bi, 4, "uint"), NumPut(h, bi, 8, "uint"), NumPut(40, bi, 0, "uint")
               , NumPut(1, bi, 12, "ushort"), NumPut(0, bi, 16), NumPut(bpp, bi, 14, "ushort")
            hbm := DllCall("CreateDIBSection", "ptr" , hdc, "ptr" , &bi
               , "uint" , 0, "ptr*", ppvBits, "ptr" , 0, "uint" , 0, "ptr")

            DllCall("ReleaseDC", "ptr", 0, "ptr", hdc)
            return hbm
         }

         CreateCompatibleDC(hdc=0)
         {
            return DllCall("CreateCompatibleDC", "ptr", hdc, "ptr")
         }

         SelectObject(hdc, hgdiobj)
         {
            return DllCall("SelectObject", "ptr", hdc, "ptr", hgdiobj, "ptr")
         }

         GraphicsFromHDC(hdc)
         {
             DllCall("gdiplus\GdipCreateFromHDC", "ptr", hdc, "ptr*", pGraphics)
             return pGraphics
         }

         SetSmoothingMode(pGraphics, SmoothingMode)
         {
            return DllCall("gdiplus\GdipSetSmoothingMode", "ptr", pGraphics, "int", SmoothingMode)
         }

         GraphicsClear(pGraphics, ARGB=0x00ffffff)
         {
             return DllCall("gdiplus\GdipGraphicsClear", "ptr", pGraphics, "uint", ARGB)
         }

         BrushCreateSolid(ARGB=0xff000000)
         {
            DllCall("gdiplus\GdipCreateSolidFill", "uint", ARGB, "ptr*", pBrush)
            return pBrush
         }

         FillEllipse(pGraphics, pBrush, x, y, w, h)
         {
            return DllCall("gdiplus\GdipFillEllipse", "ptr", pGraphics, "ptr", pBrush, "float", x, "float", y, "float", w, "float", h)
         }

         UpdateLayeredWindow(hwnd, hdc, x="", y="", w="", h="", Alpha=255)
         {
            if ((x != "") && (y != ""))
               VarSetCapacity(pt, 8), NumPut(x, pt, 0, "uint"), NumPut(y, pt, 4, "uint")

            if (w = "") ||(h = "")
               WinGetPos,,, w, h, ahk_id `%hwnd`%
            
            return DllCall("UpdateLayeredWindow", "ptr", hwnd, "ptr", 0, "ptr", ((x = "") && (y = "")) ? 0 : &pt
            , "int64*", w|h<<32, "ptr", hdc, "int64*", 0, "uint", 0, "uint*", Alpha<<16|1<<24, "uint", 2)
         }
      )
      return Script
   }
}

Перед компиляцией добавить в папку скрипта файл AutoHotkeyU32.exe из директории AHK, компилировать в Unicode 32-bit.

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

8

Re: AHK: Анимированная картинка «ожидание»

Скажите - может я не тот компилятор использую (В моем варианте можно компилировать только файл - но не папку)

Win10 x64

9

Re: AHK: Анимированная картинка «ожидание»

Его и компилируйте.

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

10

Re: AHK: Анимированная картинка «ожидание»

Спасибо  попробую!

Win10 x64

11

Re: AHK: Анимированная картинка «ожидание»

Здравствуйте. Имеется скрипт в котором до запуска основного GUI (с которым и работает пользователь) происходят проверка обновлений, целостности, чтение конфигураций и прочее. Возможно ли этот процесс весь как-то красиво вывести на экран в виде полосы загрузки или чего-то в этом роде, используя этот пример?

12

Re: AHK: Анимированная картинка «ожидание»

Специально для этого существует элемент управления Progress (индикатор прогресса).

13

Re: AHK: Анимированная картинка «ожидание»

ypppu, если я правильно понял, мне нужно будет самостоятельно расставить GuiControl,, Progress, +n (где n - любое число) в нужной части кода, предварительно выведя progress на экран, верно?

14

Re: AHK: Анимированная картинка «ожидание»

Можно так. Должны быть какие-то признаки, по которым Вы узнаёте, на какой стадии находится выполняемая операция.

15

Re: AHK: Анимированная картинка «ожидание»

ypppu, частично это решает мою проблему. Спасибо. Но, хотелось бы чтобы строчка заполнялась автоматически по мере прохождения кода, либо вот эта картинка, что крутится (которая в первом посту описана), крутилась пока скрипт не пройдет нужный кусок кода.

16

Re: AHK: Анимированная картинка «ожидание»

Сейчас начал делать. Возникла проблема: чтобы создать полосу прогресса я вызываю Gui show, но это меньшая из проблем. Большая это та, что при загрузке скрипта, когда полоса загрузки доходит до конца, GUI не исчезает, а при этом появляется основное GUI скрипта, и они сливаются вместе. Можно как-то закрыть первое gui?

17

Re: AHK: Анимированная картинка «ожидание»

Читайте русскую справку по GUI.