1

Тема: AHK: Объединение 2-х скриптов (секундомер + вебка OBS как Оверлей)

Приветствую! Помогите объединить 2 скрипта.
Каждый из них по отдельности работает на ура.
Но как только объединяю - таймер (2ой скрипт) не стартует при нажатии F10.

1ый скрипт (оверлей вебки с OBS поверх всех окон + мелочи)

#SingleInstance Force
#NoEnv
SetBatchLines -1

Name = Cam OverLay

GroupAdd, AppGroup, % Name

Gui +AlwaysOnTop
Gui Color, 0x000000
Gui Add, Button, x125 y50 w102 h23, Подтвердить
Gui Add, ListBox, vG1 hwndhListbox x25 y151 w196 h160
Gui Add, Button, gNewApp hwndhBut x125 y19 w102 h23, Поиск процесса
Gui Add, Button, gOBS x15 y19 w102 h23, OBS для ЗАПИСИ
Gui Add, Button, gOBS1 x15 y50 w102 h23, OBS для СТРИМА
Gui Add, Button, gReverse x125 y104 w102 h23, Реверс
Gui Add, Button, gHide x21 y330 w205 h23, Скрыть / показать значки
Gui Add, Text, x18 y90 w210 h2 +0x10
Gui Font, c0xFFFFFF
Gui Add, GroupBox, x18 y134 w211 h188, Выбрать процесс
Gui Font
Gui Add, Edit, hwndhSear gGet vPoisk x17 y105 w100 h21, Поиск процесса...
Menu, Tray, NoIcon

;-------------------------------------------------------------------------------------------------------


;-------------------------------------------------------------------------------------------------------

;for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
; Txt .= Process.Caption "|"
;GetSortedProcessesByLoad()
;GuiControl,, % hListbox, % Txt	; Вставить из переменной.

Gui Show, w246 h365, % Name
Return

GuiClose:
;proc = SEC.exe
;Process, Close, %proc%
ExitApp

;-------------------------------------------------------------------------------------------------------



;-------------------------------------------------------------------------------------------------------

hide:
DesktopIcons()
DesktopIcons(Show:=-1, hWnd:=0) {
If ! hWnd := DllCall("GetWindow", "Ptr",WinExist("ahk_class Progman"), "UInt",5, "Ptr")
     hWnd := DllCall("GetWindow", "Ptr",WinExist("ahk_class WorkerW"), "UInt",5, "Ptr")
If DllCall("IsWindowVisible", "Ptr",DllCall("GetWindow","Ptr",hWnd, "UInt",5, "Ptr")) != Show
   DllCall("SendMessage","Ptr",hWnd, "Ptr",0x111, "Ptr",0x7402, "Ptr",0)
}
return

;-------------------------------------------------------------------------------------------------------

OBS:
Run, C:\Program Files\obs-studio\bin\64bit\obs64.exe, C:\Program Files\obs-studio\bin\64bit\
Sleep, 3500
WinSetTitle, ahk_class Qt5152QWindowIcon, , OBS
Sleep, 200
WinMove OBS,, 670, 270, 1244, 999 ; перемещаем OBS + ресайз
Sleep, 1000
WinActivate, OBS
Sleep, 1000
MouseMove, 300, 780
Sleep, 200
MouseClick, left, 300, 780
Sleep, 200
MouseMove, 100, 780
Sleep, 200
MouseClick, left, 100, 780
MouseClick, right, 100, 780
Sleep, 200
MouseMove, 150, 613
Sleep, 200
MouseClick, left, 150, 613
Sleep, 200
;If Not ОкноБезРамокДляВебки
;{
		WinMove Оконный проектор (Источник) - Cam,, -170, -76, 700, 528 ; перемещаем окошко в угол + ресайз
		WinSet Style, -0x800000, Оконный проектор (Источник) - Cam ; -рамка
		WinSet Style, -0x40000, Оконный проектор (Источник) - Cam ; -рамка
		WinSet Style, -0x400000, Оконный проектор (Источник) - Cam ; -рамка
        WinSet, Region, 0-0 699-0 699-459 0-459 0-0, Оконный проектор (Источник) - Cam
;		ОкноБезРамокДляВебки := true
;}
Sleep, 200
WinMove Cam OverLay,, 1206, 373, 252, 394 ; перемещаем Cam Overlay + ресайз (нулевой)
Sleep, 200
Run, C:\Users\Skibyxa\Desktop\Games
Sleep, 200
WinMove Games,, 376, 164, 1138, 733 ; перемещаем Games + ресайз (нулевой)
Sleep, 200
;Gui, 2:Show, w275 h80 x5 y380 NA, Секундомер
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
		 }
}
Return

;-------------------------------------------------------------------------------------------------------

OBS1:
Run, C:\Program Files\obs-studio\bin\64bit\obs64.exe, C:\Program Files\obs-studio\bin\64bit\
Sleep, 3500
WinSetTitle, ahk_class Qt5152QWindowIcon, , OBS
Sleep, 200
WinMove OBS,, 670, 270, 1244, 999 ; перемещаем OBS + ресайз
Sleep, 1000
WinActivate, OBS
Sleep, 1000
MouseMove, 300, 795
Sleep, 200
MouseClick, left, 300, 795
Sleep, 200
MouseMove, 75, 813
Sleep, 200
MouseClick, left, 75, 813
MouseClick, right, 75, 813
Sleep, 200
MouseMove, 130, 650
Sleep, 200
MouseClick, left, 130, 650
Sleep, 500
WinMove Оконный проектор (Источник) - КАМЕРА,, -170, -76, 700, 528 ; перемещаем окошко в угол + ресайз
WinSet Style, -0x800000, Оконный проектор (Источник) - КАМЕРА ; -рамка
WinSet Style, -0x40000, Оконный проектор (Источник) - КАМЕРА ; -рамка
WinSet Style, -0x400000, Оконный проектор (Источник) - КАМЕРА ; -рамка
WinSet, Region, 0-0 699-0 699-459 0-459 0-0, Оконный проектор (Источник) - КАМЕРА
Sleep, 200
WinMove Cam OverLay,, 1206, 373, 252, 394 ; перемещаем Cam Overlay + ресайз (нулевой)
Sleep, 200
Run, C:\Users\Skibyxa\Desktop\Games
Sleep, 200
WinMove Games,, 376, 164, 1138, 733 ; перемещаем Games + ресайз (нулевой)
Sleep, 200
;Gui, 2:Show, w275 h80 x5 y380 NA, Секундомер
;Run, C:\Users\Skibyxa\Desktop\SEC.exe, C:\Users\Skibyxa\Desktop\
;Sleep, 200
;SetWinDelay, 0
;WinWait, Секундомер   ; указать реальное название окна
;DetectHiddenWindows, On
;WinHide
;WinSet, ExStyle, ^0x80   ; toggle the WS_EX_TOOLWINDOW
;WinShow
;Sleep, 200
;WinSet Style, -0x800000, Секундомер ; -рамка
;WinSet Style, -0x40000, Секундомер ; -рамка
;WinSet Style, -0x400000, Секундомер ; -рамка
;WinSet, Region, 0-0 699-0 699-459 0-459 0-0, Секундомер
;Sleep, 200
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
		 }
}
Return

;-------------------------------------------------------------------------------------------------------

#IfWinActive, Ahk_Group AppGroup

; Перехват клавиши Enter в своём окне:
Enter::
KeyWait, %A_ThisHotkey%, U

ControlGetFocus, F_Now, % Name	; Получить текущий выбранный контрол.
If (F_Now = "ListBox1")		; Если фокус на списке сохранить пункт и выйти:
{
 Gui, Submit, NoHide
 ToolTip, Переменная = %G1%
 Sleep, 300
 ToolTip
 Return
}
Else If (F_Now = "Edit1")	; Поиск в списке:
{
 GoTo, Get
}

;Else
; Send, {%A_ThisHotkey%}	; Нажать Enter если нет совпадений.
Return

#If

;-------------------------------------------------------------------------------------------------------

Get:
Gui, Submit, NoHide
T=
Loop, Parse, Txt, |
{
 If InStr(A_LoopField, Poisk)
 {
  SendMessage, 390, A_Index-1, 0,, ahk_id %hListbox%	; Выделить найденный пункт.
  T := A_Index
  Break
 }
}
If !T
{
 ToolTip, Нет такого.,0,0
 Sleep, 400
}
ToolTip
Return

;-------------------------------------------------------------------------------------------------------

ButtonПодтвердить:
myVar := MaxLoad.ProcessName
Gui, Submit, NoHide
WinActivate, ahk_exe %myVar%
Sleep, 1000
BorderSize:=0
WinMove, ahk_exe %myVar%,, -BorderSize, -BorderSize, 2560+2*BorderSize, 1440+2*BorderSize
WinSet, Style, -0xC00000, ahk_exe %myVar% ; убрать рамку
Sleep, 500
WinHide, ahk_exe Cam OverLay.exe
Return

;-------------------------------------------------------------------------------------------------------

Reverse:
Reverse := !Reverse
GoSub, App

If Reverse
 Sort, Txt, R D|

GuiControl,, % hListbox, |	; Очистить список.
GuiControl,, % hListbox, % Txt	; Вставить из переменной.
Return

;-------------------------------------------------------------------------------------------------------

NewApp_Old:
Txt2 := Txt			; Резерв тек. списка.
GuiControl,, % hListbox, |	; Очистить список.
GuiControl,, % hListbox, Ожидание...
GuiControl, Disable, % hBut	; Блок кнопки.
GuiControl, Disable, % hSear	; Разблок поиска.
SetTimer, NewP, 1000		; Тест каждую секунду.
Return

;-------------------------------------------------------------------------------------------------------

NewP:	; Отсев новых программ.
ZapList = System|explorer.exe|firefox.exe|vmware-vmx.exe|obs64.exe|nvcontainer.exe|LogiCapture.exe|ManyCam.exe|ManyCamService.exe

SortedProcesses := GetSortedProcessesByLoad()
MaxLoad := SortedProcesses[1]

If (MaxLoad.ProcessName ~= ZapList)
{
 ;ToolTip, % MaxLoad.ProcessName " Запрещён!"
 Return
}

GuiControl,, G1, % "|"        ; Очистить перед добавлением процесса.
GuiControl,, G1, % "" . MaxLoad.ProcessName
Return

;-------------------------------------------------------------------------------------------------------

; Обновлённый участок:
NewApp:	; Запуск / Стоп таймера - кнопка.
SW++
If !Mod(SW,2)
 GoTo, Stop

GuiControl,, G1, % "|"        ; Очистить перед добавлением процесса.
GuiControl,, G1, Ожидание...
GuiControl,, % hBut, Остановить
GuiControl, Disable, % hSear	; Блок поиска.
SetTimer, NewP, 1000		; Тест каждую секунду.
Return

Stop:
GuiControl,, % hBut, Поиск процесса
GuiControl, Enable, % hSear	; Разблок поиска.
SetTimer, NewP, Off		; Выкл. обновление.
Return

;-------------------------------------------------------------------------------------------------------


GetSortedProcessesByLoad() {
   static LoadByPid := {}, prevSystemTime := ""
   Processes := WTSEnumProcesses()
   systemTime := GetSystemTimes()
   for k, v in Processes {
      processTime := GetProcessTimes(v.PID)
      if LoadByPid[v.PID]
         v.Load := 100*(processTime - LoadByPid[v.PID]) / (systemTime - prevSystemTime)
      LoadByPid[v.PID] := processTime
   }
   if prevSystemTime
      SortedProcesses := SortByLoad(Processes)
   prevSystemTime := systemTime
   Return SortedProcesses
}

WTSEnumProcesses() {
   DllCall("Wtsapi32\WTSEnumerateProcesses", "Ptr", 0, "UInt", 0, "UInt", 1, "PtrP", pProcessInfo, "PtrP", count)
   Processes := []
   pPtr := pProcessInfo
   Loop % count {
      Processes.Push({ PID:         NumGet(pPtr + 4, "UInt")
                     , ProcessName: StrGet(NumGet(pPtr + 8)) })
      pPtr += A_PtrSize = 4 ? 16 : 24
   }
   DllCall("Wtsapi32\WTSFreeMemory", "Ptr", pProcessInfo)
   Return Processes
}

RunAsAdmin(exitIfNotAdmin := false) {
   commandLine := DllCall("GetCommandLine", "str")
   isRestarted := !!RegExMatch(commandLine, " /restart(?!\S)")
   while !( A_IsAdmin || isRestarted ) {
      try Run, % "*RunAs " . (A_IsCompiled ? """" . A_ScriptFullPath . """ /restart"
                                           : """" . A_AhkPath . """ /restart """ . A_ScriptFullPath . """")
      catch
         break 
      ExitApp
   }
   if !A_IsAdmin {
      MsgBox, Failed to run the script as admin!
      if exitIfNotAdmin
         ExitApp
   }
}

SetPrivilege(privilege, enable := true) {
   static PROCESS_QUERY_INFORMATION := 0x400, TOKEN_ADJUST_PRIVILEGES := 0x20, SE_PRIVILEGE_ENABLED := 0x2
   
   hProc := DllCall("OpenProcess", "UInt", PROCESS_QUERY_INFORMATION, "Int", false, "UInt", DllCall("GetCurrentProcessId"), "Ptr")
   DllCall("Advapi32\OpenProcessToken", "Ptr", hProc, "UInt", TOKEN_ADJUST_PRIVILEGES, "PtrP", token)
   
   DllCall("Advapi32\LookupPrivilegeValue", "Ptr", 0, "Str", privilege, "Int64P", luid)
   VarSetCapacity(TOKEN_PRIVILEGES, 16, 0)
   NumPut(1, TOKEN_PRIVILEGES, "UInt")
   NumPut(luid, TOKEN_PRIVILEGES, 4, "Int64")
   NumPut(SE_PRIVILEGE_ENABLED, TOKEN_PRIVILEGES, 12, "UInt")
   DllCall("Advapi32\AdjustTokenPrivileges", "Ptr", token, "Int", !enable, "Ptr", &TOKEN_PRIVILEGES, "UInt", 0, "Ptr", 0, "Ptr", 0)
   res := A_LastError
   DllCall("CloseHandle", "Ptr", token)
   DllCall("CloseHandle", "Ptr", hProc)
   Return res  ; success — 0
}

GetProcessTimes(PID) {
   hProc := DllCall("OpenProcess", "UInt", PROCESS_QUERY_INFORMATION := 0x400, "int", 0, "UInt", PID, "Ptr")
   DllCall("GetProcessTimes", "Ptr", hProc, "Int64P", CreationTime, "Int64P", ExitTime, "Int64P", KernelTime, "Int64P", UserTime)
   DllCall("CloseHandle", "Ptr", hProc)
   Return KernelTime + UserTime
}

GetSystemTimes() {
   DllCall("GetSystemTimes", "Int64P", IdleTime, "Int64P", KernelTime, "Int64P", UserTime)
   Return KernelTime + UserTime
}

SortByLoad(Processes) {
   str := ""
   for k, v in Processes {
      if v.PID
         str .= (str ? "`n" : "") . v.Load . "|" . v.ProcessName . "|" . v.PID
   }
   Sort, str, N R
   SortedProcesses := []
   Loop, parse, str, `n
   {
      RegExMatch(A_LoopField, "(.*)\|(.*)\|(.+)", m)
      SortedProcesses.Push({Load: m1, ProcessName: m2, PID: m3})
   }
   Return SortedProcesses
}
Return

App:	; Создать список запущенных.
Txt = 
for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
 Txt .= Process.Caption "|"
Return

~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
		 }
	}
	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
		 }
	}
return

~F12::
Run, D:\VIDEOS\РОЛИКИ НА ОБРАБОТКУ
Return

~Numpad0::
IfWinExist, Последние сообщения - DonationAlerts — Mozilla Firefox
    {
        WinGet, State, MinMax, Последние сообщения - DonationAlerts — Mozilla Firefox
        If State = -1 ; если окно минимизировано, то...
          {
            WinActivate, Последние сообщения - DonationAlerts — Mozilla Firefox ; восстановить свернутое окно
            Sleep, 300
            Send {F5 2}
          }  
        Else ; если окно НЕ минимизировано, то...
        {
            IfWinActive, Последние сообщения - DonationAlerts — Mozilla Firefox ; если окно активно, то...
                WinMinimize, Последние сообщения - DonationAlerts — Mozilla Firefox ; свернуть окно
            Else ; если окно НЕ активно, то...
            {
                WinActivate, Последние сообщения - DonationAlerts — Mozilla Firefox ; окно - на передний план
                Sleep, 300
                Send {F5 2}
            }    
        }
    }
Return

~Numpad5::
WinShow, ahk_exe Cam OverLay.exe
Return

2-ой скрипт (таймер, как оверлей поверх всех окон):

#SingleInstance Force
#NoEnv

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

~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
}

Объединил следующим образом:

#SingleInstance Force
#NoEnv
SetBatchLines -1

Name = Cam OverLay

GroupAdd, AppGroup, % Name

Gui +AlwaysOnTop
Gui Color, 0x000000
Gui Add, Button, x125 y50 w102 h23, Подтвердить
Gui Add, ListBox, vG1 hwndhListbox x25 y151 w196 h160
Gui Add, Button, gNewApp hwndhBut x125 y19 w102 h23, Поиск процесса
Gui Add, Button, gOBS x15 y19 w102 h23, OBS для ЗАПИСИ
Gui Add, Button, gOBS1 x15 y50 w102 h23, OBS для СТРИМА
Gui Add, Button, gReverse x125 y104 w102 h23, Реверс
Gui Add, Button, gHide x21 y330 w205 h23, Скрыть / показать значки
Gui Add, Text, x18 y90 w210 h2 +0x10
Gui Font, c0xFFFFFF
Gui Add, GroupBox, x18 y134 w211 h188, Выбрать процесс
Gui Font
Gui Add, Edit, hwndhSear gGet vPoisk x17 y105 w100 h21, Поиск процесса...
Menu, Tray, NoIcon

;-------------------------------------------------------------------------------------------------------

Start := 0
Gui, 2:-Caption +Alwaysontop +LastFound
Gui, 2:Font, s50, impact
Gui, 2:Add, Text, vText x8 y8 w250 h60 +0x200, --:--:--
;Gui, 2:Show, w275 h80 x5 y380 NA, Секундомер
;Return

;-------------------------------------------------------------------------------------------------------

;for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
; Txt .= Process.Caption "|"
;GetSortedProcessesByLoad()
;GuiControl,, % hListbox, % Txt	; Вставить из переменной.

Gui Show, w246 h365, % Name
Return

GuiClose:
;proc = SEC.exe
;Process, Close, %proc%
ExitApp

;-------------------------------------------------------------------------------------------------------



;-------------------------------------------------------------------------------------------------------

hide:
DesktopIcons()
DesktopIcons(Show:=-1, hWnd:=0) {
If ! hWnd := DllCall("GetWindow", "Ptr",WinExist("ahk_class Progman"), "UInt",5, "Ptr")
     hWnd := DllCall("GetWindow", "Ptr",WinExist("ahk_class WorkerW"), "UInt",5, "Ptr")
If DllCall("IsWindowVisible", "Ptr",DllCall("GetWindow","Ptr",hWnd, "UInt",5, "Ptr")) != Show
   DllCall("SendMessage","Ptr",hWnd, "Ptr",0x111, "Ptr",0x7402, "Ptr",0)
}
return

;-------------------------------------------------------------------------------------------------------

OBS:
Run, C:\Program Files\obs-studio\bin\64bit\obs64.exe, C:\Program Files\obs-studio\bin\64bit\
Sleep, 3500
WinSetTitle, ahk_class Qt5152QWindowIcon, , OBS
Sleep, 200
WinMove OBS,, 670, 270, 1244, 999 ; перемещаем OBS + ресайз
Sleep, 1000
WinActivate, OBS
Sleep, 1000
MouseMove, 300, 780
Sleep, 200
MouseClick, left, 300, 780
Sleep, 200
MouseMove, 100, 780
Sleep, 200
MouseClick, left, 100, 780
MouseClick, right, 100, 780
Sleep, 200
MouseMove, 150, 613
Sleep, 200
MouseClick, left, 150, 613
Sleep, 200
;If Not ОкноБезРамокДляВебки
;{
		WinMove Оконный проектор (Источник) - Cam,, -170, -76, 700, 528 ; перемещаем окошко в угол + ресайз
		WinSet Style, -0x800000, Оконный проектор (Источник) - Cam ; -рамка
		WinSet Style, -0x40000, Оконный проектор (Источник) - Cam ; -рамка
		WinSet Style, -0x400000, Оконный проектор (Источник) - Cam ; -рамка
        WinSet, Region, 0-0 699-0 699-459 0-459 0-0, Оконный проектор (Источник) - Cam
;		ОкноБезРамокДляВебки := true
;}
Sleep, 200
WinMove Cam OverLay,, 1206, 373, 252, 394 ; перемещаем Cam Overlay + ресайз (нулевой)
Sleep, 200
Run, C:\Users\Skibyxa\Desktop\Games
Sleep, 200
WinMove Games,, 376, 164, 1138, 733 ; перемещаем Games + ресайз (нулевой)
Sleep, 200
Gui, 2:Show, w275 h80 x5 y380 NA, Секундомер
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
		 }
}
Return

;-------------------------------------------------------------------------------------------------------

OBS1:
Run, C:\Program Files\obs-studio\bin\64bit\obs64.exe, C:\Program Files\obs-studio\bin\64bit\
Sleep, 3500
WinSetTitle, ahk_class Qt5152QWindowIcon, , OBS
Sleep, 200
WinMove OBS,, 670, 270, 1244, 999 ; перемещаем OBS + ресайз
Sleep, 1000
WinActivate, OBS
Sleep, 1000
MouseMove, 300, 795
Sleep, 200
MouseClick, left, 300, 795
Sleep, 200
MouseMove, 75, 813
Sleep, 200
MouseClick, left, 75, 813
MouseClick, right, 75, 813
Sleep, 200
MouseMove, 130, 650
Sleep, 200
MouseClick, left, 130, 650
Sleep, 500
WinMove Оконный проектор (Источник) - КАМЕРА,, -170, -76, 700, 528 ; перемещаем окошко в угол + ресайз
WinSet Style, -0x800000, Оконный проектор (Источник) - КАМЕРА ; -рамка
WinSet Style, -0x40000, Оконный проектор (Источник) - КАМЕРА ; -рамка
WinSet Style, -0x400000, Оконный проектор (Источник) - КАМЕРА ; -рамка
WinSet, Region, 0-0 699-0 699-459 0-459 0-0, Оконный проектор (Источник) - КАМЕРА
Sleep, 200
WinMove Cam OverLay,, 1206, 373, 252, 394 ; перемещаем Cam Overlay + ресайз (нулевой)
Sleep, 200
Run, C:\Users\Skibyxa\Desktop\Games
Sleep, 200
WinMove Games,, 376, 164, 1138, 733 ; перемещаем Games + ресайз (нулевой)
Sleep, 200
Gui, 2:Show, w275 h80 x5 y380 NA, Секундомер
;Run, C:\Users\Skibyxa\Desktop\SEC.exe, C:\Users\Skibyxa\Desktop\
;Sleep, 200
;SetWinDelay, 0
;WinWait, Секундомер   ; указать реальное название окна
;DetectHiddenWindows, On
;WinHide
;WinSet, ExStyle, ^0x80   ; toggle the WS_EX_TOOLWINDOW
;WinShow
;Sleep, 200
;WinSet Style, -0x800000, Секундомер ; -рамка
;WinSet Style, -0x40000, Секундомер ; -рамка
;WinSet Style, -0x400000, Секундомер ; -рамка
;WinSet, Region, 0-0 699-0 699-459 0-459 0-0, Секундомер
;Sleep, 200
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
		 }
}
Return

;-------------------------------------------------------------------------------------------------------

#IfWinActive, Ahk_Group AppGroup

; Перехват клавиши Enter в своём окне:
Enter::
KeyWait, %A_ThisHotkey%, U

ControlGetFocus, F_Now, % Name	; Получить текущий выбранный контрол.
If (F_Now = "ListBox1")		; Если фокус на списке сохранить пункт и выйти:
{
 Gui, Submit, NoHide
 ToolTip, Переменная = %G1%
 Sleep, 300
 ToolTip
 Return
}
Else If (F_Now = "Edit1")	; Поиск в списке:
{
 GoTo, Get
}

;Else
; Send, {%A_ThisHotkey%}	; Нажать Enter если нет совпадений.
Return

#If

;-------------------------------------------------------------------------------------------------------

Get:
Gui, Submit, NoHide
T=
Loop, Parse, Txt, |
{
 If InStr(A_LoopField, Poisk)
 {
  SendMessage, 390, A_Index-1, 0,, ahk_id %hListbox%	; Выделить найденный пункт.
  T := A_Index
  Break
 }
}
If !T
{
 ToolTip, Нет такого.,0,0
 Sleep, 400
}
ToolTip
Return

;-------------------------------------------------------------------------------------------------------

ButtonПодтвердить:
myVar := MaxLoad.ProcessName
Gui, Submit, NoHide
WinActivate, ahk_exe %myVar%
Sleep, 1000
BorderSize:=0
WinMove, ahk_exe %myVar%,, -BorderSize, -BorderSize, 2560+2*BorderSize, 1440+2*BorderSize
WinSet, Style, -0xC00000, ahk_exe %myVar% ; убрать рамку
Sleep, 500
WinHide, ahk_exe Cam OverLay.exe
Return

;-------------------------------------------------------------------------------------------------------

Reverse:
Reverse := !Reverse
GoSub, App

If Reverse
 Sort, Txt, R D|

GuiControl,, % hListbox, |	; Очистить список.
GuiControl,, % hListbox, % Txt	; Вставить из переменной.
Return

;-------------------------------------------------------------------------------------------------------

NewApp_Old:
Txt2 := Txt			; Резерв тек. списка.
GuiControl,, % hListbox, |	; Очистить список.
GuiControl,, % hListbox, Ожидание...
GuiControl, Disable, % hBut	; Блок кнопки.
GuiControl, Disable, % hSear	; Разблок поиска.
SetTimer, NewP, 1000		; Тест каждую секунду.
Return

;-------------------------------------------------------------------------------------------------------

NewP:	; Отсев новых программ.
ZapList = System|explorer.exe|firefox.exe|vmware-vmx.exe|obs64.exe|nvcontainer.exe|LogiCapture.exe|ManyCam.exe|ManyCamService.exe

SortedProcesses := GetSortedProcessesByLoad()
MaxLoad := SortedProcesses[1]

If (MaxLoad.ProcessName ~= ZapList)
{
 ;ToolTip, % MaxLoad.ProcessName " Запрещён!"
 Return
}

GuiControl,, G1, % "|"        ; Очистить перед добавлением процесса.
GuiControl,, G1, % "" . MaxLoad.ProcessName
Return

;-------------------------------------------------------------------------------------------------------

; Обновлённый участок:
NewApp:	; Запуск / Стоп таймера - кнопка.
SW++
If !Mod(SW,2)
 GoTo, Stop

GuiControl,, G1, % "|"        ; Очистить перед добавлением процесса.
GuiControl,, G1, Ожидание...
GuiControl,, % hBut, Остановить
GuiControl, Disable, % hSear	; Блок поиска.
SetTimer, NewP, 1000		; Тест каждую секунду.
Return

Stop:
GuiControl,, % hBut, Поиск процесса
GuiControl, Enable, % hSear	; Разблок поиска.
SetTimer, NewP, Off		; Выкл. обновление.
Return

;-------------------------------------------------------------------------------------------------------


GetSortedProcessesByLoad() {
   static LoadByPid := {}, prevSystemTime := ""
   Processes := WTSEnumProcesses()
   systemTime := GetSystemTimes()
   for k, v in Processes {
      processTime := GetProcessTimes(v.PID)
      if LoadByPid[v.PID]
         v.Load := 100*(processTime - LoadByPid[v.PID]) / (systemTime - prevSystemTime)
      LoadByPid[v.PID] := processTime
   }
   if prevSystemTime
      SortedProcesses := SortByLoad(Processes)
   prevSystemTime := systemTime
   Return SortedProcesses
}

WTSEnumProcesses() {
   DllCall("Wtsapi32\WTSEnumerateProcesses", "Ptr", 0, "UInt", 0, "UInt", 1, "PtrP", pProcessInfo, "PtrP", count)
   Processes := []
   pPtr := pProcessInfo
   Loop % count {
      Processes.Push({ PID:         NumGet(pPtr + 4, "UInt")
                     , ProcessName: StrGet(NumGet(pPtr + 8)) })
      pPtr += A_PtrSize = 4 ? 16 : 24
   }
   DllCall("Wtsapi32\WTSFreeMemory", "Ptr", pProcessInfo)
   Return Processes
}

RunAsAdmin(exitIfNotAdmin := false) {
   commandLine := DllCall("GetCommandLine", "str")
   isRestarted := !!RegExMatch(commandLine, " /restart(?!\S)")
   while !( A_IsAdmin || isRestarted ) {
      try Run, % "*RunAs " . (A_IsCompiled ? """" . A_ScriptFullPath . """ /restart"
                                           : """" . A_AhkPath . """ /restart """ . A_ScriptFullPath . """")
      catch
         break 
      ExitApp
   }
   if !A_IsAdmin {
      MsgBox, Failed to run the script as admin!
      if exitIfNotAdmin
         ExitApp
   }
}

SetPrivilege(privilege, enable := true) {
   static PROCESS_QUERY_INFORMATION := 0x400, TOKEN_ADJUST_PRIVILEGES := 0x20, SE_PRIVILEGE_ENABLED := 0x2
   
   hProc := DllCall("OpenProcess", "UInt", PROCESS_QUERY_INFORMATION, "Int", false, "UInt", DllCall("GetCurrentProcessId"), "Ptr")
   DllCall("Advapi32\OpenProcessToken", "Ptr", hProc, "UInt", TOKEN_ADJUST_PRIVILEGES, "PtrP", token)
   
   DllCall("Advapi32\LookupPrivilegeValue", "Ptr", 0, "Str", privilege, "Int64P", luid)
   VarSetCapacity(TOKEN_PRIVILEGES, 16, 0)
   NumPut(1, TOKEN_PRIVILEGES, "UInt")
   NumPut(luid, TOKEN_PRIVILEGES, 4, "Int64")
   NumPut(SE_PRIVILEGE_ENABLED, TOKEN_PRIVILEGES, 12, "UInt")
   DllCall("Advapi32\AdjustTokenPrivileges", "Ptr", token, "Int", !enable, "Ptr", &TOKEN_PRIVILEGES, "UInt", 0, "Ptr", 0, "Ptr", 0)
   res := A_LastError
   DllCall("CloseHandle", "Ptr", token)
   DllCall("CloseHandle", "Ptr", hProc)
   Return res  ; success — 0
}

GetProcessTimes(PID) {
   hProc := DllCall("OpenProcess", "UInt", PROCESS_QUERY_INFORMATION := 0x400, "int", 0, "UInt", PID, "Ptr")
   DllCall("GetProcessTimes", "Ptr", hProc, "Int64P", CreationTime, "Int64P", ExitTime, "Int64P", KernelTime, "Int64P", UserTime)
   DllCall("CloseHandle", "Ptr", hProc)
   Return KernelTime + UserTime
}

GetSystemTimes() {
   DllCall("GetSystemTimes", "Int64P", IdleTime, "Int64P", KernelTime, "Int64P", UserTime)
   Return KernelTime + UserTime
}

SortByLoad(Processes) {
   str := ""
   for k, v in Processes {
      if v.PID
         str .= (str ? "`n" : "") . v.Load . "|" . v.ProcessName . "|" . v.PID
   }
   Sort, str, N R
   SortedProcesses := []
   Loop, parse, str, `n
   {
      RegExMatch(A_LoopField, "(.*)\|(.*)\|(.+)", m)
      SortedProcesses.Push({Load: m1, ProcessName: m2, PID: m3})
   }
   Return SortedProcesses
}
Return

App:	; Создать список запущенных.
Txt = 
for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
 Txt .= Process.Caption "|"
Return

~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
		 }
	}
	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
		 }
	}
return

~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
}

~F12::
Run, D:\VIDEOS\РОЛИКИ НА ОБРАБОТКУ
Return

~Numpad0::
IfWinExist, Последние сообщения - DonationAlerts — Mozilla Firefox
    {
        WinGet, State, MinMax, Последние сообщения - DonationAlerts — Mozilla Firefox
        If State = -1 ; если окно минимизировано, то...
          {
            WinActivate, Последние сообщения - DonationAlerts — Mozilla Firefox ; восстановить свернутое окно
            Sleep, 300
            Send {F5 2}
          }  
        Else ; если окно НЕ минимизировано, то...
        {
            IfWinActive, Последние сообщения - DonationAlerts — Mozilla Firefox ; если окно активно, то...
                WinMinimize, Последние сообщения - DonationAlerts — Mozilla Firefox ; свернуть окно
            Else ; если окно НЕ активно, то...
            {
                WinActivate, Последние сообщения - DonationAlerts — Mozilla Firefox ; окно - на передний план
                Sleep, 300
                Send {F5 2}
            }    
        }
    }
Return

~Numpad5::
WinShow, ahk_exe Cam OverLay.exe
Return

В объединенном скрипте таймер открывает, поверх всех окон отображается, как надо, но, почему то не стартует (сам таймер) при нажатии на F10... Уже несколько дней ковыряю скрипт, никак не пойму...

2

Re: AHK: Объединение 2-х скриптов (секундомер + вебка OBS как Оверлей)

Указать номер окна?

GuiControl, Номер_Gui, Text, % FormatTime(A_TickCount-Time)
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

3

Re: AHK: Объединение 2-х скриптов (секундомер + вебка OBS как Оверлей)

__Михаил__
Да! Сработало вот в таком формате:

GuiControl, 2:, Text, % FormatTime(A_TickCount-Time)

Спасибо!