изображение_2023-01-01_030813044.png
Пользователь сам нарисует нужный ему путь.
А в скрипте этот ресурс состыкуешь с файлами. Например:
Подскажите как записать видео работы браузера в скрипте баса в режиме запуска?
Конечно же можно тыкнуть "отобразить браузер" и записывать экран любой софтиной типа camtasia\faststone. таким образом мы будем видеть что происходит в раскрытом браузере и в логе.
Но если выполнится кубик сброс то браузер конечно же исчезнет и потом если в скрипте браузер снова открывается, то он откроется в свёрнутом режиме и захват экрана уже не будет видеть "движуху" в браузере.
Самое простое Что приходит в - это костыль с помощью autohotkey который будет постоянно тыкать раскрывая браузер , но опять же это костыль(((
есть ещё такой модуль как snapshot, но он делает скрины и только на конкретных местах.
Может кто-то знает более простой вариант? мне нужно именно чтобы браузер всегда был раскрыт в режиме запуска.

@Nikolas Сам не пробовал, но может этот способ более норм.
Нужен автокликер с определением скриншотов (этот нашёл, но не пробовал, может есть и альтернативы).
https://github.com/fckguapp/AutoImageClicker
Если на экране будет виден этот скриншот,

то кликер сделает по нему клик. Заодно можно сделать и разворачивание браузера на весь экран.
Ну, может ещё пригодится расширение для записи видео
https://chromewebstore.google.com/detail/screen-recorder/hniebljpgcogalllopnjokppmgbhaden
А можно попросить разработчика сделать какой-нибудь код для запуска скрипта с развёрнутым браузером.
в общем Решил проблему написав autohotkeyscript. вот он . может кому-то тоже будет полезно
требует autohotkey версии v1.1.37.02
горячие клавиши запуска\паузы:
Ctrl+Alt+P
вместо :
BasPidStatic := 10696
поставьте свой номер процесса из Диспетчера задач:

вместо:
BasTitleKey := "instagram_5.2"
поставьте текст без разрыва на латинице который присутствует в заголовке окна вашего процесса

; ==========================================================
; BAS Keep Browser Visible — bind by PID, multi-monitor ready
; AHK v1.1.37.02 — держит окно "Браузер" раскрытым
; ==========================================================
#NoEnv
#SingleInstance, Force
SetBatchLines, -1
SetTitleMatchMode, 2
SendMode, Input
CoordMode, Mouse, Window
CoordMode, Pixel, Window
DetectHiddenWindows, Off
; Включаем DPI-awareness (пер-монитор). Если нет Shcore — откатываемся.
DllCall("Shcore\SetProcessDpiAwareness", "Int", 2, "Int")
if (ErrorLevel)
DllCall("SetProcessDPIAware")
; ------------------- КОНФИГ -------------------
BasPidStatic := 10696 ; <-- твой текущий PID BAS
BasTitleKey := "instagram_5.2" ; ASCII-фолбэк, если PID не найден
BasWinClass := "Qt5QWindowIcon"
BasExe := "BrowserAutomationStudio.exe"
BrowserWinClass := "WorkerWindowClass"
BrowserExe := "Worker.exe"
BrowserWinTitle := "Браузер" ; файл должен быть UTF-8 with BOM
TimerMs := 700
; Координаты "Показать браузер" (клиентская область BAS)
ShowLinkX := 56
ShowLinkY := 292
; ---- Мониторы ----
; Куда класть окно "Браузер": 0 = не трогать, 1/2/3 = номер монитора
BrowserOnMonitor := 2
; Куда переместить окно BAS: 0 = не трогать, 1/2/3 = номер монитора
BasOnMonitor := 0
; Отступы и размер "Браузер" внутри выбранного монитора (рабочая область)
BrowserMarginX := 40
BrowserMarginY := 80
BrowserWidth := 520
BrowserHeight := 900
; ----------------- /КОНФИГ --------------------
; Глобальные
gBasHwnd := ""
gBasPid := 0
gBrowserHwnd := ""
gOn := 0
; --------- ГОРЯЧИЕ КЛАВИШИ ----------
; Ctrl+Alt+P — старт/пауза мониторинга
^!p::
gOn := !gOn
SetTimer, WatchLoop, % (gOn ? TimerMs : "Off")
TrayTip, BAS Watcher, % (gOn ? "Мониторинг включен" : "Мониторинг выключен"), 1500, 1
return
; Ctrl+Alt+Q — выход
^!q::ExitApp
; Ctrl+Alt+C — калибровка координат "Показать браузер" (клиент BAS)
^!c::
GetBasSpec(basSpec)
if (!WinExist(basSpec))
return
WinActivate, %basSpec%
Sleep, 120
MouseGetPos, mx, my
Clipboard := mx "," my
TrayTip, BAS Watcher, % "Координаты (отн. BAS): " mx "," my " скопированы", 1500, 1
return
; Ctrl+Alt+B — привязать к активному окну BAS (если PID сменился)
^!b::
WinGetClass, c, A
WinGet, pname, ProcessName, A
if (c = BasWinClass && pname = BasExe) {
gBasHwnd := WinExist("A")
WinGet, gBasPid, PID, ahk_id %gBasHwnd%
BasPidStatic := gBasPid
gBrowserHwnd := ""
WinGetTitle, t, ahk_id %gBasHwnd%
TrayTip, BAS Watcher, % "Привязан к BAS PID " gBasPid " | " t, 2000, 1
if (BasOnMonitor)
MoveWindowToMonitor(gBasHwnd, BasOnMonitor)
} else {
TrayTip, BAS Watcher, "Активное окно не BAS", 1500, 1
}
return
; Ctrl+Alt+I — показать статус
^!i::
WinGetTitle, t, ahk_id %gBasHwnd%
MsgBox, 64, BAS Watcher
, % "BAS PID: " gBasPid " (static=" BasPidStatic ")\nBAS HWND: " gBasHwnd "`nTitle: " t "`nBrowser HWND: " gBrowserHwnd "`nМониторинг: " (gOn ? "ON" : "OFF")
return
; --------- АВТОСТАРТ ----------
Initialize()
if (BasOnMonitor && IsWindowValid(gBasHwnd))
MoveWindowToMonitor(gBasHwnd, BasOnMonitor)
gOn := 1
SetTimer, WatchLoop, %TimerMs%
TrayTip, BAS Watcher, "Мониторинг включен (автостарт)", 1500, 1
return
; ================= ФУНКЦИИ =================
Initialize() {
global BasPidStatic, BasTitleKey, BasWinClass, BasExe, gBasHwnd, gBasPid
if (BasPidStatic > 0) {
spec := "ahk_pid " . BasPidStatic . " ahk_class " . BasWinClass . " ahk_exe " . BasExe
if (WinExist(spec)) {
gBasHwnd := WinExist(spec)
gBasPid := BasPidStatic
return
}
}
spec2 := BasTitleKey . " ahk_class " . BasWinClass . " ahk_exe " . BasExe
if (WinExist(spec2)) {
gBasHwnd := WinExist(spec2)
WinGet, gBasPid, PID, ahk_id %gBasHwnd%
}
}
GetBasSpec(ByRef out) {
global gBasHwnd, BasPidStatic, BasWinClass, BasExe, BasTitleKey
if (IsWindowValid(gBasHwnd)) {
out := "ahk_id " . gBasHwnd
return
}
if (BasPidStatic > 0) {
out := "ahk_pid " . BasPidStatic . " ahk_class " . BasWinClass . " ahk_exe " . BasExe
} else {
out := BasTitleKey . " ahk_class " . BasWinClass . " ahk_exe " . BasExe
}
}
GetParentPid(pid) {
wmi := ComObjGet("winmgmts:")
for p in wmi.ExecQuery("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId=" pid)
return p.ParentProcessId + 0
return 0
}
IsWindowValid(hwnd) {
if (!hwnd)
return false
WinGet, out, ID, ahk_id %hwnd%
return (out = hwnd)
}
; Рабочая область монитора N (без панели задач)
GetMonitorWorkArea(idx, ByRef l, ByRef t, ByRef r, ByRef b) {
SysGet, c, MonitorCount
if (idx < 1 || idx > c) {
l := t := r := b := ""
return false
}
SysGet, Mon, MonitorWorkArea, %idx%
l := MonLeft, t := MonTop, r := MonRight, b := MonBottom
return true
}
; Переместить окно в рабочую область монитора N
MoveWindowToMonitor(hwnd, idx) {
global BrowserMarginX, BrowserMarginY, BrowserWidth, BrowserHeight
if (!IsWindowValid(hwnd))
return
if (!GetMonitorWorkArea(idx, l, t, r, b))
return
x := l + BrowserMarginX
y := t + BrowserMarginY
w := BrowserWidth
h := BrowserHeight
WinMove, ahk_id %hwnd%, , %x%, %y%, %w%, %h%
}
FindBrowserForThisBas() {
global gBasPid, BrowserWinClass, BrowserExe, BrowserWinTitle
if (!gBasPid)
return ""
; 1) По классу+exe и ParentPID
WinGet, list, List, ahk_class %BrowserWinClass% ahk_exe %BrowserExe%
Loop, %list%
{
thisH := list%A_Index%
WinGet, thisPid, PID, ahk_id %thisH%
ppid := GetParentPid(thisPid)
if (ppid = gBasPid)
return thisH
}
; 2) Фолбэк — по заголовку "Браузер"
WinGet, list2, List, %BrowserWinTitle%
Loop, %list2%
{
thisH := list2%A_Index%
WinGet, thisPid, PID, ahk_id %thisH%
ppid := GetParentPid(thisPid)
if (ppid = gBasPid)
return thisH
}
return ""
}
ClickShowInBas() {
global ShowLinkX, ShowLinkY
GetBasSpec(basSpec)
if (!WinExist(basSpec))
return
WinGet, bstate, MinMax, %basSpec%
if (bstate = -1)
WinRestore, %basSpec%
WinActivate, %basSpec%
Sleep, 120
ControlClick, x%ShowLinkX% y%ShowLinkY%, %basSpec%, , , NA
}
TendBrowser(hwnd) {
global AlwaysOnTopOn, BrowserOnMonitor
if (!hwnd)
return
WinGet, st, MinMax, ahk_id %hwnd%
if (st = -1)
WinRestore, ahk_id %hwnd%
if (AlwaysOnTopOn)
WinSet, AlwaysOnTop, On, ahk_id %hwnd%
if (BrowserOnMonitor)
MoveWindowToMonitor(hwnd, BrowserOnMonitor)
}
; ================= ОСНОВНОЙ ЦИКЛ =================
WatchLoop:
{
global gBasHwnd, gBasPid, gBrowserHwnd, BasOnMonitor
GetBasSpec(basSpec)
if (!WinExist(basSpec)) {
Initialize()
return
}
if (!IsWindowValid(gBasHwnd))
gBasHwnd := WinExist(basSpec)
if (!gBasPid) {
WinGet, gBasPid, PID, ahk_id %gBasHwnd%
if (!gBasPid)
return
}
if (BasOnMonitor && IsWindowValid(gBasHwnd))
MoveWindowToMonitor(gBasHwnd, BasOnMonitor)
if (IsWindowValid(gBrowserHwnd)) {
TendBrowser(gBrowserHwnd)
return
}
gBrowserHwnd := FindBrowserForThisBas()
if (gBrowserHwnd) {
TendBrowser(gBrowserHwnd)
return
}
ClickShowInBas()
Loop, 5
{
Sleep, 300
gBrowserHwnd := FindBrowserForThisBas()
if (gBrowserHwnd) {
TendBrowser(gBrowserHwnd)
break
}
}
}
return