1

Тема: AHK: Простой секундомер в виде отдельного окна (динамический)

Приветствую!
Хотелось бы реализовать простой секундомер в виде отдельного окна GUI, которое будет при нажатии на клавишу (в примере F2) - показываться в определенной области экрана, при повторном нажатии клавиши - скрываться.
Запускает секундомер другая клавиша (в примере - F1).
В данном примере показывается статические цифры, а мне хотелось бы что они были динамическими, т.е. чтобы я мог бы видеть идущие секунды при нажатии F2.
Элементы окна я думаю сам смогу убрать, и шрифт побольше сделать тоже. В первую очередь хочется понять как сделать это элементов GUI (отдельного окна) и чтобы циферки бегали, без статики.

F1:: time := A_TickCount ; старт таймера

F2:: msgbox, % "Прошло времени: " FormatTime(A_TickCount-time)

FormatTime(Time) {
	Local Rest, Hours, Min, Sec
	If Time < 0
		Return "00:00:00"
	Rest := Mod(Time, 3600000)
	 Hours := Format("{:02d}", Time // 3600000)
	 Min := Format("{:02d}", Rest // 60000)
	 Sec := Format("{:02d}", Mod(Rest, 60000) // 1000)
	Return Hours ":" Min ":" Sec
}

2

Re: AHK: Простой секундомер в виде отдельного окна (динамический)

Вроде уже обсуждали такое.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

3 (изменено: __Михаил__, 2021-12-03 03:04:32)

Re: AHK: Простой секундомер в виде отдельного окна (динамический)

Вот пример с Gui:

Gui -MinimizeBox -MaximizeBox
Gui Add, Text, vText x8 y8 w120 h23, --:--:--
Gui Add, Button, gGT x136 y8 w80 h23, Запуск
Gui Show, w222 h39, Секундомер
Return

GuiEscape:
GuiClose:
ExitApp

GT:
Time := A_TickCount
SetTimer, Now, 1000
Now:
GuiControl,, Text, % FormatTime(A_TickCount-Time)
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK: Простой секундомер в виде отдельного окна (динамический)

__Михаил__ пишет:

Вот пример с Gui:

Gui -MinimizeBox -MaximizeBox
Gui Add, Text, vText x8 y8 w120 h23, --:--:--
Gui Add, Button, gGT x136 y8 w80 h23, Запуск
Gui Show, w222 h39, Секундомер
Return

GuiEscape:
GuiClose:
ExitApp

GT:
Time := A_TickCount
SetTimer, Now, 1000
Now:
GuiControl,, Text, % FormatTime(A_TickCount-Time)
Return

Спасибо большое! Начинаю подгонять под то что нужно.

Сделал прозрачный фон, убрал кнопки, запуск по горячей клавише - все работает.

На F9 хотел сделать реализацию "скрыть/показать" поверх игры, но вместо скрытия оно окрашивается в зеленый и не скрывается... В чем может быть проблема? Понимаю, что что-то с прозрачностью перемудрил...

gui -caption +alwaysontop +lastfound 
gui, font, s50, impact
gui color, 0x1c9900
winset, transcolor, 0x1c9900
Gui Add, Text, vText x8 y8 w250 h60 +0x200, --:--:--
Gui Show, w400 h100, Секундомер
Return

GuiEscape:
GuiClose:
ExitApp

F10::
Time := A_TickCount
SetTimer, Now, 1000
Return

Now:
GuiControl,, Text, % FormatTime(A_TickCount-Time)
Return

FormatTime(Time) {
	Local Rest, Hours, Min, Sec
	If Time < 0
		Return "00:00:00"
	Rest := Mod(Time, 3600000)
	 Hours := Format("{:02d}", Time // 3600000)
	 Min := Format("{:02d}", Rest // 60000)
	 Sec := Format("{:02d}", Mod(Rest, 60000) // 1000)
	Return Hours ":" Min ":" Sec
}

F9::
	IfWinExist, Секундомер
	{
		WinGet ExStyle, ExStyle
		if Not (ExStyle & 0x8)  ; 0x8 is WS_EX_TOPMOST. The window is always-on-top.
		{
			WinSet ExStyle, +0x20 ; чтобы клики проходили сквозь окошко
			WinSet Transparent, 255 ; прозрачность окна: 0 - максимальная, 255 - непрозрачное 
			WinSet AlwaysOnTop, On
		} else 
		 {
			WinSet ExStyle, -0x20
			WinSet Transparent, 255
			WinSet AlwaysOnTop, Off
			; переключаем режим "поверх всех" в окне игры, чтобы окошко ушло на задний план
			WinSet AlwaysOnTop, On, A
			WinSet AlwaysOnTop, Off, A
		 }
	}

5

Re: AHK: Простой секундомер в виде отдельного окна (динамический)

Тут дело со стилем Gui, а я стилями мало знаком, редко их использую.
Как такой вариант:

SW=1
Gui -Caption +AlwaysOnTop +LastFound 
Gui, Font, s50, impact
Gui Color, 0x1c9900
WinSet, TransColor, 0x1c9900
Gui Add, Text, vText x8 y8 w250 h60 +0x200, --:--:--
Gui Show, w400 h100 NA, Секундомер
Return

GuiEscape:
GuiClose:
ExitApp

F10::
Time := A_TickCount
SetTimer, Now, 1000
Now:
GuiControl,, Text, % FormatTime(A_TickCount-Time)
Return

FormatTime(Time){
 Local Rest, Hours, Min, Sec
 If (Time < 0)
  Return "00:00:00"
 Rest := Mod(Time, 3600000)
 Hours := Format("{:02d}", Time // 3600000)
 Min := Format("{:02d}", Rest // 60000)
 Sec := Format("{:02d}", Mod(Rest, 60000) // 1000)
 Return Hours ":" Min ":" Sec
}

F9::
If (SW := !SW)
 Gui Show, NA
Else
 Gui Hide
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

6

Re: AHK: Простой секундомер в виде отдельного окна (динамический)

__Михаил__
К сожалению, нет...
Некоторые игры крашатся при такое функцией, потестил, тут именно нужно что-то с прозрачность сделать.

7

Re: AHK: Простой секундомер в виде отдельного окна (динамический)

Michael, если скрипт применяется для игры, он должен быть в соответствующей ветке, переношу.

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

8

Re: AHK: Простой секундомер в виде отдельного окна (динамический)

teadrinker
Для игры, сорян, тупанул. Точнее для всех игр одновременно, как оверлей. Универсально, так сказать.

__Михаил__
Остановился на варианте без прозрачного фона. Он не так важен.
Хочу вот что еще добавить: чтобы при первом нажатии F10 таймер стартовал (что уже есть), при повторном - останавливался, третье нажатие - запуск с нуля снова. И так далее.
Текущий скрипт где работает исчезновение оверлея корректно:

gui -caption +alwaysontop +LastFound
gui, font, s50, impact
;gui color, 0x1c9900
;WinSet, TransColor, 0x1c9900
Gui Add, Text, vText x8 y8 w250 h60 +0x200, --:--:--
Gui Show, w511 h80 x5 y380 NA, Секундомер
Return

GuiEscape:
GuiClose:
ExitApp

F10::
Time := A_TickCount
SetTimer, Now, 1000
Return

Now:
GuiControl,, Text, % FormatTime(A_TickCount-Time)
Return

FormatTime(Time) {
	Local Rest, Hours, Min, Sec
	If Time < 0
		Return "00:00:00"
	Rest := Mod(Time, 3600000)
	 Hours := Format("{:02d}", Time // 3600000)
	 Min := Format("{:02d}", Rest // 60000)
	 Sec := Format("{:02d}", Mod(Rest, 60000) // 1000)
	Return Hours ":" Min ":" Sec
}

F8:: 
	IfWinExist, Секундомер
	{
		WinGet ExStyle, ExStyle
		if Not (ExStyle & 0x8)  ; 0x8 is WS_EX_TOPMOST. The window is always-on-top.
		{
			WinSet ExStyle, +0x20 ; чтобы клики проходили сквозь окошко
			WinSet Transparent, 255 ; прозрачность окна: 0 - максимальная, 255 - непрозрачное 
			WinSet AlwaysOnTop, On
		} else 
		 {
			WinSet ExStyle, -0x20
			WinSet Transparent, 255
			WinSet AlwaysOnTop, Off
			; переключаем режим "поверх всех" в окне игры, чтобы окошко ушло на задний план
			WinSet AlwaysOnTop, On, A
			WinSet AlwaysOnTop, Off, A
		 }
	}

9 (изменено: __Михаил__, 2021-12-05 18:24:51)

Re: AHK: Простой секундомер в виде отдельного окна (динамический)

Остановить секундомер не проблема - отключить таймер.

Start := 0
gui -caption +alwaysontop +LastFound
gui, font, s50, impact
;gui color, 0x1c9900
;WinSet, TransColor, 0x1c9900
Gui Add, Text, vText x8 y8 w250 h60 +0x200, --:--:--
Gui Show, w275 h80 x5 y380 NA, Секундомер
Return

GuiEscape:
GuiClose:
ExitApp

F10::
KeyWait, %A_ThisHotkey%, U
If (Start := !Start){
 Time := A_TickCount
 SetTimer, Now, 1000
}
Else
 SetTimer, Now, Off
Now:
GuiControl,, Text, % FormatTime(A_TickCount-Time)
Return


FormatTime(Time) {
 Local Rest, Hours, Min, Sec
 If Time < 0
  Return "00:00:00"
 Rest := Mod(Time, 3600000)
  Hours := Format("{:02d}", Time // 3600000)
  Min := Format("{:02d}", Rest // 60000)
  Sec := Format("{:02d}", Mod(Rest, 60000) // 1000)
 Return Hours ":" Min ":" Sec
}

F8:: 
 IfWinExist, Секундомер
 {
  WinGet ExStyle, ExStyle
  if Not (ExStyle & 0x8)  ; 0x8 is WS_EX_TOPMOST. The window is always-on-top.
  {
   WinSet ExStyle, +0x20 ; чтобы клики проходили сквозь окошко
   WinSet Transparent, 255 ; прозрачность окна: 0 - максимальная, 255 - непрозрачное 
   WinSet AlwaysOnTop, On
  } else 
   {
   WinSet ExStyle, -0x20
   WinSet Transparent, 255
   WinSet AlwaysOnTop, Off
   ; переключаем режим "поверх всех" в окне игры, чтобы окошко ушло на задний план
   WinSet AlwaysOnTop, On, A
   WinSet AlwaysOnTop, Off, A
   }
 }
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

10

Re: AHK: Простой секундомер в виде отдельного окна (динамический)

__Михаил__
Огромное спасибо! Всё работает!