1 (изменено: Bulef, 2020-04-04 22:50:06)

Тема: AHK: Вопросы по скрипту с таймерами.

Здравствуйте. Основной скрипт, представляет из себя GUI с секундомером, таймером или будильником.
Возникло несколько вопросов в процессе:
1. Не могу сделать точные таймеры. Возникает десинхронизация с временем с запозданием на 20-50% от нормы, если использовать простые циклы. Очень хочется реализовать через функцию таймера, но я не понимаю как создать таймеры с переменной в названии, так как таймеров понадобится много. Можно конечно заранее заготовить, к примеру 10 таймеров, но хотелось бы решение поэлегантнее.
2. Не могу никак разобраться с принципами работы DllCall("ShowCursor", "Uint", 0). При первом запуске удаётся скрыть курсор, но более эта функция не работает в моём скрипте. В чём проблема, не пойму.

Два раза "`" - переключить режим интерфейса. Полный режим и режим отображения.
В режиме отображения, "`" - скрывает интерфейс.
Для запуска часов, зажмите "`", наберите полный номер таймера с помощью строки цифр и отожмите "`".

; GTA5AHK
; Версия 1.07
; \GTA5AHK\Test versions\GTA5AHK 1.07 TEST

; Начало открывающего блока

#SingleInstance Force
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

SplitPath, A_ScriptName, , , , ScriptName

SetTitleMatchMode, 2

; Конец открывающего блока

; Начало Exit

GoTo, WrappingAroundExit ; Начало обтекания строк.

#Persistent
!sc02D:: ; Alt + X
ExitApp

WrappingAroundExit: ; Конец обтекания строк.

; Конец Exit

; Начало GTA5AHK

#InstallKeybdHook
#InstallMouseHook
SetBatchLines -1

GuiToggle =
TextColor = White
TextColor2 = Red
BackColor = Black
TransColor = 7a7a7a ; 010000 Чёрный 7a7a7a Серый feffff Белый
SizeForWindow = % A_ScreenHeight/135
PollingFrequency = 10
UpdateFrequency = 100

SetTimer, RefreshClocks, %PollingFrequency%
SetTimer, RefreshGui, 0


GoTo, WrappingGTA5AHK ; Начало обтекания строк.

$LButton::
MouseGetPos, , , MouseWindow, , 
If MouseWindow = % AHKWindow
{
	If GuiToggle =
	If AHKWindowStatus =
	{
		AHKWindowStatus = Hide
		Gui, Show, Hide
	}
	
	Send {LButton Down}
	
	If AHKWindowStatus = Hide
	{
		AHKWindowStatus =
		Gui, Show, NA
	}
	
	KeyWait, LButton
	Send {LButton Up}
}
Else
{
	Send {LButton Down}
	KeyWait, LButton
	Send {LButton Up}
}
Return


$RButton::
MouseGetPos, , , MouseWindow, , 
If MouseWindow = % AHKWindow
{
	If GuiToggle =
	If AHKWindowStatus =
	{
		AHKWindowStatus = Hide
		Gui, Show, Hide
	}
	
	Send {RButton Down}
	
	If AHKWindowStatus = Hide
	{
		AHKWindowStatus =
		Gui, Show, NA
	}
	
	KeyWait, RButton
	Send {RButton Up}
}
Else
{
	Send {RButton Down}
	KeyWait, RButton
	Send {RButton Up}
}
Return


$MButton::
MouseGetPos, , , MouseWindow, , 
If MouseWindow = % AHKWindow
{
	If GuiToggle =
	If AHKWindowStatus =
	{
		AHKWindowStatus = Hide
		Gui, Show, Hide
	}
	
	Send {MButton Down}
	
	If AHKWindowStatus = Hide
	{
		AHKWindowStatus =
		Gui, Show, NA
	}
	
	KeyWait, MButton
	Send {MButton Up}
}
Else
{
	Send {MButton Down}
	KeyWait, MButton
	Send {MButton Up}
}
Return


SortClocksNumbers()
{
	Global ClocksNumbers
	
	LargestClockNumber = 0
	Loop, Parse, ClocksNumbers, %A_Space%, %A_Space%
	{
		If A_LoopField > %LargestClockNumber%
			LargestClockNumber = %A_LoopField%
	}
	
	ClockNumber = 0
	Loop
	{
		ClockNumber2 = %LargestClockNumber%
		Loop, Parse, ClocksNumbers, %A_Space%, %A_Space%
		{
			If A_LoopField > %ClockNumber%
			{
				If A_LoopField < %ClockNumber2%
					ClockNumber2 = %A_LoopField%
			}
		}
		ClockNumber = %ClockNumber2%
		If ClockNumber = 0
		{}
		Else
		AssortedClocksNumbers = % AssortedClocksNumbers ClockNumber " "
		
		If ClockNumber = %LargestClockNumber%
			Break
		Else
			Continue
	}
	Return AssortedClocksNumbers
}


ProcessExecution()
{
	Global
	Local LocalProcessNumber, LocalSubProcess
	LocalProcessNumber = % ProcessNumber
	LocalSubProcess = % SubProcess
	
	
	If %LocalSubProcess%ProcessNumber =
	{
		Process%LocalProcessNumber%MaxNumber = 0
		
		If Process%LocalProcessNumber%Queue =
		{
			%LocalSubProcess%ProcessNumber = 1
			Process%LocalProcessNumber%Queue = % Process%LocalProcessNumber%Queue %LocalSubProcess%ProcessNumber " "
		}
		Else
		Loop, Parse, Process%LocalProcessNumber%Queue, %A_Space%, %A_Space%
		{
			If A_LoopField =
			{
				%LocalSubProcess%ProcessNumber = % Process%LocalProcessNumber%MaxNumber+1
				Process%LocalProcessNumber%Queue = % Process%LocalProcessNumber%Queue %LocalSubProcess%ProcessNumber " "
				Break
			}
			Process%LocalProcessNumber%MaxNumber = %A_LoopField%
			Continue
		}
	}
	
	If %LocalSubProcess%ProcessNumber <>
	{
		If (Process%LocalProcessNumber%CurrentNumber = %LocalSubProcess%ProcessNumber OR Process%LocalProcessNumber%CurrentNumber = "")
		{
			%LocalSubProcess%()
			StringReplace, Process%LocalProcessNumber%Queue, Process%LocalProcessNumber%Queue, % %LocalSubProcess%ProcessNumber " ", , 
			%LocalSubProcess%ProcessNumber =
			
			If Process%LocalProcessNumber%Queue =
				Process%LocalProcessNumber%CurrentNumber =
			Else
			Loop, Parse, Process%LocalProcessNumber%Queue, %A_Space%, %A_Space%
			{
				If A_Index = 1
				{
					Process%LocalProcessNumber%CurrentNumber = %A_LoopField%
					Break
				}
			}
		}
		Else
		If Process%LocalProcessNumber%CurrentNumber <> % %LocalSubProcess%ProcessNumber
		{
			SetTimer, %LocalSubProcess%, 10
			Return
		}
	}
}


RefreshClocks:
RefreshClocks()
Return

RefreshClocks()
{
	Global
	Local ClockNumber, ClockHours, ClockMinutes
	
	FormatTime, ClockHours, , HH
	FormatTime, ClockMinutes, , mm
	FullCurrentTime = % (ClockHours*3600+ClockMinutes*60)*1000
	FormatTime, TimeString, , HH:mm
	GuiControl, , TimeForWindow, % TimeString
	
	Loop, Parse, ClocksNumbers, %A_Space%, %A_Space%
	{
		If A_LoopField =
			Break
		
		ClockNumber = %A_LoopField%
		
		If Clock%ClockNumber% = Started
		{
			If Clock%ClockNumber%Type = StopWatch
			{
				Clock%ClockNumber%FullTime += %PollingFrequency%
				
				Continue
			}
			Else
			If Clock%ClockNumber%Type = Timer
			{
				If Clock%ClockNumber%FullTime > 0
					Clock%ClockNumber%FullTime -= %PollingFrequency%
				Else
				If Clock%ClockNumber%FullTime <= 0
					Clock%ClockNumber% = EndedUpdate
				
				Continue
			}
			Else
			If Clock%ClockNumber%Type = AlarmClock
			{
				If FullCurrentTime >= % Clock%ClockNumber%TargetFullTime
				{
					Clock%ClockNumber%FullTime = % Clock%ClockNumber%TargetFullTime
					Clock%ClockNumber% = EndedUpdate
				}
				Else
					Clock%ClockNumber%FullTime = % FullCurrentTime
				
				Continue
			}
		}
	}
}


ClockDelimiterUpdate:
SetTimer, ClockDelimiterUpdate, 1000
ClockDelimiterUpdateStatus = On
If ClockDelimiter = % ":"
	ClockDelimiter = % " "
Else
If ClockDelimiter = % " "
	ClockDelimiter = % ":"
Else
If ClockDelimiter =
	ClockDelimiter = % " "
ClockDelimiterUpdateStatus =
Return


UpdateGui:
ProcessNumber = 1
SubProcess = UpdateGui
ProcessExecution()
Return

UpdateGui()
{
	Global
	Local ClockNumber, ClockHours, ClockMinutes
	
	SetTimer, UpdateGui, %UpdateFrequency%
	
	Loop, Parse, ClocksNumbers, %A_Space%, %A_Space%
	{
		If A_LoopField =
			Break
		
		ClockNumber = %A_LoopField%
		
		
		If GuiToggle =
		{
			If Clock%ClockNumber% = Started
			{
				ClockHours = % Floor(Floor(Clock%ClockNumber%FullTime/1000)/3600)
				ClockMinutes = % Floor((Floor(Clock%ClockNumber%FullTime/1000)-(ClockHours*3600))/60)
				
				If ClockHours < 10
					Clock%ClockNumber%Time = % "0" ClockHours 
				Else
					Clock%ClockNumber%Time = % ClockHours
					
				If ClockMinutes < 10
					Clock%ClockNumber%Time = % Clock%ClockNumber%Time ClockDelimiter "0" ClockMinutes
				Else
					Clock%ClockNumber%Time = % Clock%ClockNumber%Time ClockDelimiter ClockMinutes
				
				
				GuiControl, , Clock%ClockNumber%Time, % Clock%ClockNumber%Time
				
				Continue
			}
			Else
			If Clock%ClockNumber% = EndedUpdate
			{
				ClockHours = % Floor(Floor(Clock%ClockNumber%FullTime/1000)/3600)
				ClockMinutes = % Floor((Floor(Clock%ClockNumber%FullTime/1000)-(ClockHours*3600))/60)
				
				
				If ClockHours < 10
					Clock%ClockNumber%Time = % "0" ClockHours 
				Else
					Clock%ClockNumber%Time = % ClockHours
					
				If ClockMinutes < 10
					Clock%ClockNumber%Time = % Clock%ClockNumber%Time ":" "0" ClockMinutes
				Else
					Clock%ClockNumber%Time = % Clock%ClockNumber%Time ":" ClockMinutes
				
				
				Gui, Font, c%TextColor2%
				GuiControl, Font, Clock%ClockNumber%Time
				GuiControl, , Clock%ClockNumber%Time, % Clock%ClockNumber%Time
				Gui, Font, c%TextColor%
		
				Clock%ClockNumber% = Ended
				
				Continue
			}
		}
	}
}


ClockOperations:
ProcessNumber = 1
SubProcess = ClockOperations
ProcessExecution()
Return

ClockOperations()
{
	Global
	Local ClockHours, ClockMinutes
	
	SetTimer, ClockOperations, Delete
	
	If ClockNumber is not Integer
	{}
	Else
	If ClockNumber = 0
	{}
	Else
	If ClockOptions = Add
	{
		ClocksNumbers = % ClocksNumbers ClockNumber " "
		ClocksNumbers = % SortClocksNumbers()
		
		Clock%ClockNumber% = Exist
		Clock%ClockNumber%Number = %ClockNumber%
		Clock%ClockNumber%Type = StopWatch
		Clock%ClockNumber%Name = Часы №%ClockNumber%
		Clock%ClockNumber%Time = 00:00
		Clock%ClockNumber%FullTime = 0
		Clock%ClockNumber%TargetFullTime = 0
		
		ClockOptions =
	}
	Else
	If ClockOptions = Delete
	{
		StringReplace, ClocksNumbers, ClocksNumbers, % ClockNumber " ", , 
		ClocksNumbers = % SortClocksNumbers()
		
		Clock%ClockNumber% =
		Clock%ClockNumber%Number =
		Clock%ClockNumber%Type =
		Clock%ClockNumber%Name =
		Clock%ClockNumber%Time =
		Clock%ClockNumber%FullTime =
		Clock%ClockNumber%TargetFullTime =
		
		ClockOptions =
	}
	Else
	If ClockOptions = TypeChange
	{
		If Clock%ClockNumber%Type = StopWatch
		{
			Clock%ClockNumber%Type = Timer
			Clock%ClockNumber%FullTime = % Clock%ClockNumber%TargetFullTime
			Clock%ClockNumber% = Exist
		}
		Else
		If Clock%ClockNumber%Type = Timer
		{
			Clock%ClockNumber%Type = AlarmClock
			Clock%ClockNumber%FullTime = % Clock%ClockNumber%TargetFullTime
			Clock%ClockNumber% = Exist
		}
		Else
		If Clock%ClockNumber%Type = AlarmClock
		{
			Clock%ClockNumber%Type = StopWatch
			Clock%ClockNumber%FullTime = 0
			Clock%ClockNumber% = Exist
		}
	}
	Else
	If ClockOptions = Up
		Clock%ClockNumber%Number = % ClockNumber - 1
	Else
	If ClockOptions = Down
		Clock%ClockNumber%Number = % ClockNumber + 1
	Else
	If ClockOptions = ChangeClockStatus
	{
		If Clock%ClockNumber%Type = StopWatch
		{
			If Clock%ClockNumber% = Exist
				Clock%ClockNumber% = Started
			Else
			If Clock%ClockNumber% = Started
			{
				Clock%ClockNumber%TargetFullTime = % Clock%ClockNumber%FullTime
				Clock%ClockNumber% = EndedUpdate
			}
			Else
			If Clock%ClockNumber% = Ended
			{
				Clock%ClockNumber%FullTime = 0
				Clock%ClockNumber%Time = % "00:00"
				
				Gui, Font, c%TextColor%
				GuiControl, Font, Clock%ClockNumber%Time
				GuiControl, , Clock%ClockNumber%Time, % Clock%ClockNumber%Time
				Clock%ClockNumber% = Exist
			}
		}
		Else
		If Clock%ClockNumber%Type = Timer
		{
			If Clock%ClockNumber% = Exist
			{
				Clock%ClockNumber%FullTime = % Clock%ClockNumber%TargetFullTime
				Clock%ClockNumber% = Started
			}
			Else
			If (Clock%ClockNumber% = "Started" OR Clock%ClockNumber% = "Ended")
			{
				Clock%ClockNumber%FullTime = % Clock%ClockNumber%TargetFullTime
				
				ClockHours = % Floor(Floor(Clock%ClockNumber%TargetFullTime/1000)/3600)
				ClockMinutes = % Floor((Floor(Clock%ClockNumber%TargetFullTime/1000)-(ClockHours*3600))/60)
				
				If ClockHours < 10
					Clock%ClockNumber%Time = % "0" ClockHours 
				Else
					Clock%ClockNumber%Time = % ClockHours
					
				If ClockMinutes < 10
					Clock%ClockNumber%Time = % Clock%ClockNumber%Time ":" "0" ClockMinutes
				Else
					Clock%ClockNumber%Time = % Clock%ClockNumber%Time ":" ClockMinutes
				
				Gui, Font, c%TextColor%
				GuiControl, Font, Clock%ClockNumber%Time
				GuiControl, , Clock%ClockNumber%Time, % Clock%ClockNumber%Time
				Clock%ClockNumber% = Exist
			}
		}
		Else
		If Clock%ClockNumber%Type = AlarmClock
		{
			If Clock%ClockNumber% = Exist
			{
				Clock%ClockNumber%FullTime = % FullCurrentTime
				Clock%ClockNumber% = Started
			}
			Else
			{
				Clock%ClockNumber%FullTime = % Clock%ClockNumber%TargetFullTime
				
				ClockHours = % Floor(Floor(Clock%ClockNumber%TargetFullTime/1000)/3600)
				ClockMinutes = % Floor((Floor(Clock%ClockNumber%TargetFullTime/1000)-(ClockHours*3600))/60)
				
				If ClockHours < 10
					Clock%ClockNumber%Time = % "0" ClockHours 
				Else
					Clock%ClockNumber%Time = % ClockHours
					
				If ClockMinutes < 10
					Clock%ClockNumber%Time = % Clock%ClockNumber%Time ":" "0" ClockMinutes
				Else
					Clock%ClockNumber%Time = % Clock%ClockNumber%Time ":" ClockMinutes
				
				Gui, Font, c%TextColor%
				GuiControl, Font, Clock%ClockNumber%Time
				GuiControl, , Clock%ClockNumber%Time, % Clock%ClockNumber%Time
				Clock%ClockNumber% = Exist
			}
		}
	}
	ClockNumber =
	
	Local ClockNumber, NextClockNumber
	
	Local Clock0
	Local Clock0Type
	Local Clock0Name
	Local Clock0Time
	Local Clock0FullTime
	Local Clock0TargetFullTime
	
	Loop, Parse, ClocksNumbers, %A_Space%, %A_Space%
	{
		If A_LoopField =
			Break
		
		ClockNumber = %A_LoopField%
		
		
		If Clock%ClockNumber%Number <> ClockNumber
		{
			If Clock%ClockNumber%Number = 0
				Clock%ClockNumber%Number = %ClockNumber%
			Else
			{
				NextClockNumber = % Clock%ClockNumber%Number
				Clock%ClockNumber%Number = %ClockNumber%
				Clock%NextClockNumber%Number = %NextClockNumber%
				
				
				Clock0 = % Clock%ClockNumber%
				Clock0Type = % Clock%ClockNumber%Type
				Clock0Name = % Clock%ClockNumber%Name
				Clock0Time = % Clock%ClockNumber%Time
				Clock0FullTime = % Clock%ClockNumber%FullTime
				Clock0TargetFullTime = % Clock%ClockNumber%TargetFullTime
				
				Clock%ClockNumber% = % Clock%NextClockNumber%
				Clock%ClockNumber%Type = % Clock%NextClockNumber%Type
				Clock%ClockNumber%Name = % Clock%NextClockNumber%Name
				Clock%ClockNumber%Time = % Clock%NextClockNumber%Time
				Clock%ClockNumber%FullTime = % Clock%NextClockNumber%FullTime
				Clock%ClockNumber%TargetFullTime = % Clock%NextClockNumber%TargetFullTime
				
				Clock%NextClockNumber% = % Clock0
				Clock%NextClockNumber%Type = % Clock0Type
				Clock%NextClockNumber%Name = % Clock0Name
				Clock%NextClockNumber%Time = % Clock0Time
				Clock%NextClockNumber%FullTime = % Clock0FullTime
				Clock%NextClockNumber%TargetFullTime = % Clock0TargetFullTime
				
				Clock0 =
				Clock0Type =
				Clock0Name =
				Clock0Time =
				Clock0FullTime =
				Clock0TargetFullTime =
				
				
				If Clock%ClockNumber% <>
					ClocksNumbers = % ClocksNumbers ClockNumber " "
				Else
					StringReplace, ClocksNumbers, ClocksNumbers, % ClockNumber " ", , 
				
				If Clock%NextClockNumber% <>
					ClocksNumbers = % ClocksNumbers NextClockNumber " "
				Else
					StringReplace, ClocksNumbers, ClocksNumbers, % NextClockNumber " ", , 
				
				ClocksNumbers = % SortClocksNumbers()
				
				
				Continue
			}
		}
	}
}


ButtonОбновить:
If RefreshGuiStatus = 
{
	Gui, Submit, NoHide
	SetTimer, ClockOperations, 0
	SetTimer, RefreshGui, 0
}
Return

ButtonСекундомер: ; Clock%ClockNumber%Type StopWatch
If RefreshGuiStatus = 
{
	Gui, Submit, NoHide
	ClockOptions = %A_GuiControl%
	StringTrimLeft, ClockOptions, ClockOptions, 5
	StringTrimRight, ClockOptions, ClockOptions, 4
	ClockNumber = %ClockOptions%
	ClockOptions = TypeChange
	SetTimer, ClockOperations, 0
	SetTimer, RefreshGui, 0
}
Return

ButtonТаймер: ; Clock%ClockNumber%Type Timer
If RefreshGuiStatus = 
{
	Gui, Submit, NoHide
	ClockOptions = %A_GuiControl%
	StringTrimLeft, ClockOptions, ClockOptions, 5
	StringTrimRight, ClockOptions, ClockOptions, 4
	ClockNumber = %ClockOptions%
	ClockOptions = TypeChange
	SetTimer, ClockOperations, 0
	SetTimer, RefreshGui, 0
}
Return

ButtonБудильник: ; Clock%ClockNumber%Type AlarmClock
If RefreshGuiStatus = 
{
	Gui, Submit, NoHide
	ClockOptions = %A_GuiControl%
	StringTrimLeft, ClockOptions, ClockOptions, 5
	StringTrimRight, ClockOptions, ClockOptions, 4
	ClockNumber = %ClockOptions%
	ClockOptions = TypeChange
	SetTimer, ClockOperations, 0
	SetTimer, RefreshGui, 0
}
Return

ButtonДобавить: ; Clock%ClockNumber%Add
If RefreshGuiStatus = 
{
	Gui, Submit, NoHide
	ClockNumber = %AddNumber%
	ClockOptions = Add
	SetTimer, ClockOperations, 0
	SetTimer, RefreshGui, 0
}
Return

ButtonУдалить: ; Clock%ClockNumber%Delete
If RefreshGuiStatus = 
{
	Gui, Submit, NoHide
	ClockOptions = %A_GuiControl%
	StringTrimLeft, ClockOptions, ClockOptions, 5
	StringTrimRight, ClockOptions, ClockOptions, 6
	ClockNumber = %ClockOptions%
	ClockOptions = Delete
	SetTimer, ClockOperations, 0
	SetTimer, RefreshGui, 0
}
Return

Button/\: ; Clock%ClockNumber%Up
If RefreshGuiStatus = 
{
	Gui, Submit, NoHide
	ClockOptions = %A_GuiControl%
	StringTrimLeft, ClockOptions, ClockOptions, 5
	StringTrimRight, ClockOptions, ClockOptions, 2
	ClockNumber = %ClockOptions%
	ClockOptions = Up
	SetTimer, ClockOperations, 0
	SetTimer, RefreshGui, 0
}
Return

Button\/: ; Clock%ClockNumber%Down
If RefreshGuiStatus = 
{
	Gui, Submit, NoHide
	ClockOptions = %A_GuiControl%
	StringTrimLeft, ClockOptions, ClockOptions, 5
	StringTrimRight, ClockOptions, ClockOptions, 4
	ClockNumber = %ClockOptions%
	ClockOptions = Down
	SetTimer, ClockOperations, 0
	SetTimer, RefreshGui, 0
}
Return


RefreshGui:
ProcessNumber = 1
SubProcess = RefreshGui
ProcessExecution()
Return

RefreshGui()
{
	Global
	Local ClockNumber, ClockHours, ClockMinutes, IntegerStatus
	
	SetTimer, UpdateGui, Delete
	SetTimer, ClockDelimiterUpdate, Delete
	SetTimer, RefreshGui, Delete
	
	TextSizeForWindow = % SizeForWindow
	ElementSizeForWindow = % TextSizeForWindow+7+(TextSizeForWindow*0.50)
	XForWindow = % A_ScreenWidth/20
	YForWindow = % A_ScreenHeight/5*3
	
	Gui, Destroy
	
	
	Gui, +AlwaysOnTop +LastFound +Owner
	Gui, Color, %TransColor%, %BackColor% 
	Gui, Font, s%TextSizeForWindow% c%TextColor%
	
	FormatTime, TimeString, , HH:mm
	Gui, Add, Edit, vTimeForWindow H%ElementSizeForWindow%, % TimeString
	
	If GuiToggle = On
	{
		Gui, Add, Button, Default H%ElementSizeForWindow% ys yp, Обновить
		
		Loop
		{
			If Clock%A_Index% <>
				Continue
			If Clock%A_Index% =
			{
				AddNumber = %A_Index%
				Break
			}
		}
		Gui, Add, Edit, vAddNumber H%ElementSizeForWindow% ys yp, % AddNumber
		Gui, Add, Button, H%ElementSizeForWindow% ys yp, Добавить
	}
	
	Loop, Parse, ClocksNumbers, %A_Space%, %A_Space%
	{
		If A_LoopField =
			Break
		
		ClockNumber = %A_LoopField%
		
		
		If GuiToggleLastStatus = On
		{
			StringTrimRight, ClockHours, Clock%ClockNumber%Time, 3
			StringTrimLeft, ClockMinutes, Clock%ClockNumber%Time, 3
			
			IntegerStatus =
			
			If ClockHours is Integer
				IntegerStatus = Yes
			
			If IntegerStatus = Yes
			If ClockMinutes is Integer
				{}
			Else
				IntegerStatus =
			
			If IntegerStatus = Yes
				Clock%ClockNumber%TargetFullTime = % (ClockHours*3600+ClockMinutes*60)*1000
		}
		
		Gui, Add, Edit, vClock%ClockNumber%Number H%ElementSizeForWindow% xs Section, % Clock%ClockNumber%Number
		Gui, Add, Edit, vClock%ClockNumber%Name H%ElementSizeForWindow% ys yp, % Clock%ClockNumber%Name
		
		If GuiToggle = On
		{
			ClockHours = % Floor(Floor(Clock%ClockNumber%TargetFullTime/1000)/3600)
			ClockMinutes = % Floor((Floor(Clock%ClockNumber%TargetFullTime/1000)-(ClockHours*3600))/60)
		}
		Else
		If GuiToggle =
		{
			If Clock%ClockNumber%Type = StopWatch
			{
				ClockHours = % Floor(Floor(Clock%ClockNumber%FullTime/1000)/3600)
				ClockMinutes = % Floor((Floor(Clock%ClockNumber%FullTime/1000)-(ClockHours*3600))/60)
			}
			Else
			If Clock%ClockNumber%Type = Timer
			{
				ClockHours = % Floor(Floor(Clock%ClockNumber%TargetFullTime/1000)/3600)
				ClockMinutes = % Floor((Floor(Clock%ClockNumber%TargetFullTime/1000)-(ClockHours*3600))/60)
			}
			Else
			If Clock%ClockNumber%Type = AlarmClock
			{
				Clock%ClockNumber%FullTime = % FullCurrentTime
				Clock%ClockNumber% = Started
				ClockHours = % Floor(Floor(Clock%ClockNumber%FullTime/1000)/3600)
				ClockMinutes = % Floor((Floor(Clock%ClockNumber%FullTime/1000)-(ClockHours*3600))/60)
			}
		}
		
		If ClockHours < 10
			Clock%ClockNumber%Time = % "0" ClockHours 
		Else
			Clock%ClockNumber%Time = % ClockHours
			
		If ClockMinutes < 10
			Clock%ClockNumber%Time = % Clock%ClockNumber%Time ":" "0" ClockMinutes
		Else
			Clock%ClockNumber%Time = % Clock%ClockNumber%Time ":" ClockMinutes
		
		If (GuiToggle = "On" OR Clock%ClockNumber% = "Started" OR Clock%ClockNumber% = "Exist")
			Gui, Font, c%TextColor%
		Else
		If (Clock%ClockNumber% = "Ended" OR Clock%ClockNumber% = "EndedUpdate")
			Gui, Font, c%TextColor2%
		
		Gui, Add, Edit, vClock%ClockNumber%Time H%ElementSizeForWindow% ys yp, % Clock%ClockNumber%Time
		Gui, Font, c%TextColor%
		
		If GuiToggle = On
		{
			Gui, Add, Button, vClock%ClockNumber%Up H%ElementSizeForWindow% ys yp, /\
			Gui, Add, Button, vClock%ClockNumber%Down H%ElementSizeForWindow% ys yp, \/
		
			If Clock%ClockNumber%Type = StopWatch
				Gui, Add, Button, vClock%ClockNumber%Type H%ElementSizeForWindow% ys yp, Секундомер
			Else
			If Clock%ClockNumber%Type = Timer
				Gui, Add, Button, vClock%ClockNumber%Type H%ElementSizeForWindow% ys yp, Таймер
			Else
			If Clock%ClockNumber%Type = AlarmClock
				Gui, Add, Button, vClock%ClockNumber%Type H%ElementSizeForWindow% ys yp, Будильник
			
			Gui, Add, Button, vClock%ClockNumber%Delete H%ElementSizeForWindow% ys yp, Удалить
		}
		
		Continue
	}
	
	
	If GuiToggle =
		WinSet, TransColor, %TransColor% 128
	Else
	If GuiToggle = On
		WinSet, TransColor, %TransColor%
		
	Gui, -Caption
	If GuiToggle =
		Gui, Show, x%XForWindow% y%YForWindow% NA
	Else
	If GuiToggle = On
		Gui, Show, x%XForWindow% y%YForWindow%
	
	WinGet, AHKWindow, ID, GTA5AHK, , , 
	
	
	If GuiToggle =
	{
		GuiToggleLastStatus = 
		SetTimer, UpdateGui, 0
		SetTimer, ClockDelimiterUpdate, 0
		DllCall("ShowCursor", "Uint", 0)
	}
	Else
	If GuiToggle = On
	{
		GuiToggleLastStatus = On
		DllCall("ShowCursor", "Uint", 1)
	}
}


$sc029:: ; ~
Send {sc029 Down}
ClockNumber =
TildeStatus = On
KeyWait, sc029, T0.2
If ErrorLevel = 0
{
	KeyWait, sc029, D T0.2
	If ErrorLevel = 0
	{
		If GuiToggle = On
		{
			GuiToggle =
			SetTimer, RefreshGui, 0
		}
		Else
		If GuiToggle =
		{
			GuiToggle = On
			SetTimer, RefreshGui, 0
		}
		KeyWait, sc029
		Send {sc029 Up}
		TildeStatus =
		Return
	}
}
Else
If ErrorLevel
	KeyWait, sc029
Send {sc029 Up}
TildeStatus =

If ClockNumber =
{
	If GuiToggle =
	If AHKWindowStatus =
	{
		AHKWindowStatus = Hide
		Gui, Show, Hide
	}
	Else
	If AHKWindowStatus = Hide
	{
		AHKWindowStatus =
		Gui, Show, NA
	}
}
Else
If ClockNumber <>
{
	ClockOptions = ChangeClockStatus
	SetTimer, ClockOperations, 0
	SetTimer, UpdateGui, 10
}
Return


$sc002:: ; 1
Send {sc002 Down}
If TildeStatus = On
	ClockNumber = %ClockNumber%1
KeyWait, sc002
Send {sc002 Up}
Return

$sc003:: ; 2
Send {sc003 Down}
If TildeStatus = On
	ClockNumber = %ClockNumber%2
KeyWait, sc003
Send {sc003 Up}
Return

$sc004:: ; 3
Send {sc004 Down}
If TildeStatus = On
	ClockNumber = %ClockNumber%3
KeyWait, sc004
Send {sc004 Up}
Return

$sc005:: ; 4
Send {sc005 Down}
If TildeStatus = On
	ClockNumber = %ClockNumber%4
KeyWait, sc005
Send {sc005 Up}
Return

$sc006:: ; 5
Send {sc006 Down}
If TildeStatus = On
	ClockNumber = %ClockNumber%5
KeyWait, sc006
Send {sc006 Up}
Return

$sc007:: ; 6
Send {sc007 Down}
If TildeStatus = On
	ClockNumber = %ClockNumber%6
KeyWait, sc007
Send {sc007 Up}
Return

$sc008:: ; 7
Send {sc008 Down}
If TildeStatus = On
	ClockNumber = %ClockNumber%7
KeyWait, sc008
Send {sc008 Up}
Return

$sc009:: ; 8
Send {sc009 Down}
If TildeStatus = On
	ClockNumber = %ClockNumber%8
KeyWait, sc009
Send {sc009 Up}
Return

$sc00A:: ; 9
Send {sc00A Down}
If TildeStatus = On
	ClockNumber = %ClockNumber%9
KeyWait, sc00A
Send {sc00A Up}
Return

$sc00B:: ; 0
Send {sc00B Down}
If TildeStatus = On
	ClockNumber = %ClockNumber%0
KeyWait, sc00B
Send {sc00B Up}
Return

sc04E:: ; Num+
Send {sc04E Down}
If TildeStatus = On
{
	SizeForWindow += 2
	SetTimer, RefreshGui, 0
}
KeyWait, sc04E
Send {sc04E Up}
Return

sc04A:: ; Num-
Send {sc04A Down}
If TildeStatus = On
{
	SizeForWindow -= 2
	SetTimer, RefreshGui, 0
}
KeyWait, sc04A
Send {sc04A Up}
Return


WrappingGTA5AHK: ; Конец обтекания строк.

; Конец GTA5AHK

2

Re: AHK: Вопросы по скрипту с таймерами.

Bulef, вряд ли кто-то захочет разбирать скрипт на 1000 строк. Попробуйте создать максимально короткий скрипт, демонстрирующий проблему.

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

3

Re: AHK: Вопросы по скрипту с таймерами.

teadrinker
Извините. Я попробую что-нибудь придумать.

4

Re: AHK: Вопросы по скрипту с таймерами.

У вас слишком большой пример кода, могу только ответить тем же http://forum.script-coding.com/viewtopi … 26#p131726.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5 (изменено: Bulef, 2020-04-05 14:53:46)

Re: AHK: Вопросы по скрипту с таймерами.

teadrinker serzh82saratov
Поколдовал немого. Вот урезанная версия. Проблема всё ещё проявляется.

После запуска, требуется нажать "`" два раза, для перехода в режим редактирования.
Нужно добавить часы.
После добавления часов, переходим в режим отображения, и тут проблема. В режиме отображения, должен быть скрыт курсор при наведении на окно с GUI, но этого не происходит. Видимо, я не до конца понимаю как работает DllCall("ShowCursor", "Uint", 0) и упускаю какую-то важную деталь.

; Начало открывающего блока

#SingleInstance Force
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

SplitPath, A_ScriptName, , , , ScriptName

SetTitleMatchMode, 2

; Конец открывающего блока

; Начало Exit

GoTo, WrappingAroundExit ; Начало обтекания строк.

#Persistent
!sc02D:: ; Alt + X
ExitApp

WrappingAroundExit: ; Конец обтекания строк.

; Конец Exit

; Начало GTA5AHK


#InstallKeybdHook
#InstallMouseHook
SetBatchLines -1

GuiToggle =
TextColor = White
TextColor2 = Red
BackColor = Black
TransColor = 7a7a7a ; 010000 Чёрный 7a7a7a Серый feffff Белый
SizeForWindow = % A_ScreenHeight/135

SetTimer, RefreshGui, 0


GoTo, WrappingGTA5AHK ; Начало обтекания строк.

SortClocksNumbers() ; Сортировка часов по номеру.
{
	Global ClocksNumbers
	
	LargestClockNumber = 0
	Loop, Parse, ClocksNumbers, %A_Space%, %A_Space%
	{
		If A_LoopField > %LargestClockNumber%
			LargestClockNumber = %A_LoopField%
	}
	
	ClockNumber = 0
	Loop
	{
		ClockNumber2 = %LargestClockNumber%
		Loop, Parse, ClocksNumbers, %A_Space%, %A_Space%
		{
			If A_LoopField > %ClockNumber%
			{
				If A_LoopField < %ClockNumber2%
					ClockNumber2 = %A_LoopField%
			}
		}
		ClockNumber = %ClockNumber2%
		If ClockNumber = 0
		{}
		Else
		AssortedClocksNumbers = % AssortedClocksNumbers ClockNumber " "
		
		If ClockNumber = %LargestClockNumber%
			Break
		Else
			Continue
	}
	Return AssortedClocksNumbers
}


ClockOperations:
ClockOperations()
Return

ClockOperations() ; Операции добавления и удаления.
{
	Global
	Local ClockHours, ClockMinutes
	
	SetTimer, ClockOperations, Delete
	
	If ClockNumber is not Integer
	{}
	Else
	If ClockNumber = 0
	{}
	Else
	If ClockOptions = Add
	{
		ClocksNumbers = % ClocksNumbers ClockNumber " "
		ClocksNumbers = % SortClocksNumbers()
		
		Clock%ClockNumber% = Exist
		Clock%ClockNumber%Number = %ClockNumber%
		
		ClockOptions =
	}
	Else
	If ClockOptions = Delete
	{
		StringReplace, ClocksNumbers, ClocksNumbers, % ClockNumber " ", , 
		ClocksNumbers = % SortClocksNumbers()
		
		Clock%ClockNumber% =
		Clock%ClockNumber%Number =
		
		ClockOptions =
	}
}


ButtonДобавить: ; Clock%ClockNumber%Add
If RefreshGuiStatus = 
{
	Gui, Submit, NoHide
	ClockNumber = %AddNumber%
	ClockOptions = Add
	SetTimer, ClockOperations, 0
	SetTimer, RefreshGui, 0
}
Return

ButtonУдалить: ; Clock%ClockNumber%Delete
If RefreshGuiStatus = 
{
	ClockOptions = %A_GuiControl%
	StringTrimLeft, ClockOptions, ClockOptions, 5
	StringTrimRight, ClockOptions, ClockOptions, 6
	ClockNumber = %ClockOptions%
	ClockOptions = Delete
	SetTimer, ClockOperations, 0
	SetTimer, RefreshGui, 0
}
Return


RefreshGui:
RefreshGui()
Return

RefreshGui() ; Создание и обновление GUI
{
	Global
	Local ClockNumber, ClockHours, ClockMinutes, IntegerStatus
	
	SetTimer, RefreshGui, Delete
	
	TextSizeForWindow = % SizeForWindow
	ElementSizeForWindow = % TextSizeForWindow+7+(TextSizeForWindow*0.50)
	XForWindow = % A_ScreenWidth/20
	YForWindow = % A_ScreenHeight/5*3
	
	Gui, Destroy
	
	
	Gui, +AlwaysOnTop +LastFound +Owner
	Gui, Color, %TransColor%, %BackColor% 
	Gui, Font, s%TextSizeForWindow% c%TextColor%
	
	
	TimeString = % "00:00"
	Gui, Add, Text, vTimeForWindow H%ElementSizeForWindow%, % TimeString
	If GuiToggle =
		Gui, Add, Text, H%ElementSizeForWindow% ys yp, % "Режим с прозрачным курсором."
	
	If GuiToggle = On
	{
		Loop
		{
			If Clock%A_Index% <>
				Continue
			If Clock%A_Index% =
			{
				AddNumber = %A_Index%
				Break
			}
		}
		Gui, Add, Edit, vAddNumber H%ElementSizeForWindow% ys yp, % AddNumber
		Gui, Add, Button, H%ElementSizeForWindow% ys yp, Добавить
	}
	
	Loop, Parse, ClocksNumbers, %A_Space%, %A_Space%
	{
		If A_LoopField =
			Break
		
		ClockNumber = %A_LoopField%
		
		Gui, Add, Text, vClock%ClockNumber%Number H%ElementSizeForWindow% xs Section, % Clock%ClockNumber%Number
		
		Clock%ClockNumber%Time = 00:00
		
		Gui, Add, Text, vClock%ClockNumber%Time H%ElementSizeForWindow% ys yp, % Clock%ClockNumber%Time
		
		
		If GuiToggle = On
		{
			Gui, Add, Button, vClock%ClockNumber%Delete H%ElementSizeForWindow% ys yp, Удалить
		}
		
		Continue
	}
	
		
	Gui, -Caption
	If GuiToggle =
		Gui, Show, x%XForWindow% y%YForWindow% NA
	Else
	If GuiToggle = On
		Gui, Show, x%XForWindow% y%YForWindow%
	
	WinGet, AHKWindow, ID, GTA5AHK, , , 
	
	
	If GuiToggle =
	{
		GuiToggleLastStatus = 
		DllCall("ShowCursor", "Uint", 0)
	}
	Else
	If GuiToggle = On
	{
		GuiToggleLastStatus = On
		DllCall("ShowCursor", "Uint", 1)
	}
}


$sc029:: ; ~
Send {sc029 Down}
KeyWait, sc029, T0.2
If ErrorLevel = 0
{
	KeyWait, sc029, D T0.2
	If ErrorLevel = 0
	{
		If GuiToggle = On
		{
			GuiToggle =
			SetTimer, RefreshGui, 0
		}
		Else
		If GuiToggle =
		{
			GuiToggle = On
			SetTimer, RefreshGui, 0
		}
		KeyWait, sc029
		Send {sc029 Up}
		TildeStatus =
		Return
	}
}
Else
If ErrorLevel
	KeyWait, sc029
Send {sc029 Up}

Return


WrappingGTA5AHK: ; Конец обтекания строк.

; Конец GTA5AHK

6

Re: AHK: Вопросы по скрипту с таймерами.

Bulef пишет:

должен быть скрыт курсор при наведении на окно с GUI

Не совсем вас понял. GUI — это и есть окно.

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

7

Re: AHK: Вопросы по скрипту с таймерами.


	If GuiToggle =
	{
		GuiToggleLastStatus =  
		loop % DllCall("ShowCursor") + 1
			DllCall("ShowCursor", "Uint", 0)
	}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Вопросы по скрипту с таймерами.

serzh82saratov
Спасибо большое. Совершенно не понял как это работает.
Очень крутые скрипт-часы Вы сделали. Я не смог разобраться как их прикрутить, по этому пришлось изобретать велосипед.

А что делать с таймерами (SetTimer)? Есть ли возможность создать таймер с переменной в названии?

9

Re: AHK: Вопросы по скрипту с таймерами.


hFunc1 := Func("FuncName").Bind(123)
hFunc2 := Func("FuncName").Bind(456)

SetTimer, % hFunc1, % "-" 1111
SetTimer, % hFunc2, % "-" 2222

FuncName(key) {
 	MsgBox,,,% key, 0.4
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Вопросы по скрипту с таймерами.

serzh82saratov пишет:

hFunc1

А зачем там "h"? Это не h, это o.

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

11

Re: AHK: Вопросы по скрипту с таймерами.

teadrinker
Спасибо, забыл.

Bulef пишет:

Я не смог разобраться как их прикрутить

Вот простой пример наподобие вашего.


#SingleInstance Force
#NoEnv
ListLines Off
SetBatchLines -1

Add := 0
Gui, Margin, 10, 10
Gui, +HWNDhMain -DPIScale -Caption
Gui, Color, F9D886
Clock := New ClockGui(hMain, "Sec|Clock|Pos xm y+10|w 200|h 60|ds 1|db 20|bckgmain F9D886|bckgitem F9D886|coloritem FFFFFF|Font s30 q4|Colon Flash")
Clock.Show()
Clock.StartClock() 
Gui, Add, Button, w90 h40, Удалить
Gui, Add, Button, wp hp x+20, Добавить
Gui Show
Return

ButtonДобавить:
	Y := 130 + Add * 70
	Add++
	Timer%Add% := New ClockGui(hMain, "Sec|Timer|Pos xm y" Y "|w 200|h 60|ds 1|db 20|bckgmain 444444|bckgitem 212121|coloritem FFFFFF|Font s30 q4|Colon Flash")
	Timer%Add%.SetTime("0" Add ":00:00")
	Timer%Add%.Show()
	Timer%Add%.StartTimer()  
	Gui Show, % "h" Y + 70
	Return
	
ButtonУдалить:
	If Add = 0
		Return
	Timer%Add%.Destroy()
	Add--
	Gui Show, % "h" 130 + Add * 70
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: Вопросы по скрипту с таймерами.

teadrinker serzh82saratov
Спасибо большое за советы. Постараюсь разобраться.