Тема: 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... Уже несколько дней ковыряю скрипт, никак не пойму...