1

Тема: Открытие окна поверх игры, оверлей

Доброго времени суток!
Перейду сразу к сути, постараюсь объяснить максимально точно.
Снимаю ролики через ОБСку, в ней есть показ Источника, в моем случае окошка с камерой.
Открывается второе окно ОБСки с камерой, маленькое, оно может отображаться поверх всех окон.
Мне нужно, чтобы по горячей клавише, данное окошко показывать / скрывалось, при игре, грубо говоря посмотреть на себя и закрыть.
Скрипт я написал (потел целый день, ибо я тут полный ноль), и вот что получилось:

IfWinExist, ahk_class Qt5152QWindowIcon
{
WinSet, Style, -0x800000, Оконный проектор (Источник) - Вебка ;
WinSet, Style, -0x40000, Оконный проектор (Источник) - Вебка ;
WinSet, Style, -0x400000, Оконный проектор (Источник) - Вебка ;
WinMove, Оконный проектор (Источник) - Вебка,, 0, 0 ;
WinGet,WinState,MinMax,ahk_class Qt5152QWindowIcon
If WinState = -1
   WinRestore
else
   WinMinimize
}

Проблема в том, что когда окно я свернул по нажатию на горячую клавишу, находясь в игре, и снова развернул, нажав на ту же клавишу, игра сворачивается и показывает данное окно.
WinSet и WinMove, те, что в коде, мне сейчас не особо интересуют, да и без них всё работает также, не как нужно.
Мне нужно чтобы окно просто показалось и исчезало по нажатию клавиши, но при этом игра не сворачивалась.
Я думаю, что нужно как-то показывать неактивное окно, ибо проблемы возникают именно тогда, когда оно становится активным.
Возможно есть какая-то другая реализация данного кода, прошу помощи.
WinActivate и WinShow тоже пробовал - ничего не вышло...
Знаю, что есть бандикам и другие проги, в которых изначально есть похожая функция, но меня интересует только ОБСка...)

2

Re: Открытие окна поверх игры, оверлей

Если игра в полноэкранном режиме, то это естественное поведение самой винды - свернуть такое окно если появляется фокус на другом.
Как выход - выключить полноэкранность в игре, сделать если есть возможность режим 'В окне, без рамок'.

3

Re: Открытие окна поверх игры, оверлей

__Михаил__
Пробовал в окне,  тоже самое, как только окно с Вебкой появляется, оно активно, и игра уходит на второй план, пропадает звук, стопится сама игра.
Хотя в некоторых играх даже в полноэкранном режиме вебка скрывается/показывается как надо. Но это единичные случаи...

4

Re: Открытие окна поверх игры, оверлей

Вам нужно показывать/скрывать окно без его активации, чтобы не уводить фокус с игры. Смотрите в документации команду WinSet, AlwaysOnTop.
Чтобы случайно не кликнуть по окошку и не активировать его, можно сделать окошко некликабельным —
WinSet, Disable.

0xFFFFFF
0xFF0000
0xFFFFFF

5

Re: Открытие окна поверх игры, оверлей

stealzy
WinSet, Disable помогло в некоторых играх! Спасибо!
Образовалась еще одна проблемка...
Некоторые игры тупо не дают открыть окно с вебкой, AlwaysOnTop пробовал, тоже самое.
Ничего не происходит ни в полноэкранном режиме, не в режиме "окно без рамок". Вебка никак не выводится. Есть какой-нибудь лайфхак?
Текущий скрипт:

F9::

IfWinExist, ahk_class Qt5152QWindowIcon
{
WinGet,WinState,MinMax,ahk_class Qt5152QWindowIcon
WinSet , AlwaysOnTop , On 
WinSet, Disable
If WinState = -1
   WinRestore
else
   WinMinimize
}

6

Re: Открытие окна поверх игры, оверлей

Michael

Возможно скрипт нужно запустить от администратора.

7

Re: Открытие окна поверх игры, оверлей

__Михаил__
Это верно подмечено, без администратора это дело вообще не работает, но и при запуске с его правами, то, что писал выше.

8

Re: Открытие окна поверх игры, оверлей

stealzy
Намёк понял, только реализовал как-то криво, ибо после запуска данного скрипта, оба окна ОБСки становятся некликабельными, и приходится все закрыть через диспетчер задач...)
Посмотрите, пожалуйста, где я накосячил?
И еще вопрос, думаю, что команды [WinMove], [WinSet, Style], [WinSet, Disable] выполняются каждый раз при нажатии Ф9, но это вроде как и не нужно, а нужно единожды, только при первом нажатии. Вроде как скрипту и не мешает, но бесит эта неграмотность при написании

F9:: 

IfWinExist, ahk_class Qt5152QWindowIcon
{
WinGet,WinState,MinMax,ahk_class Qt5152QWindowIcon
WinSet, Disable
WinMove, Оконный проектор (Источник) - Вебка,, 1510, 0, 410, 310
WinSet, Style, -0x800000, Оконный проектор (Источник) - Вебка ;
WinSet, Style, -0x40000, Оконный проектор (Источник) - Вебка ;
WinSet, Style, -0x400000, Оконный проектор (Источник) - Вебка ;
If WinState = -1
   WinSet, AlwaysOnTop, On
else
   WinSet, AlwaysOnTop, Off
}

9 (изменено: stealzy, 2021-01-13 21:59:31)

Re: Открытие окна поверх игры, оверлей

F9:: 
	If Not УжеНажимали
	{
		WinMove Оконный проектор (Источник) - Вебка,, 1510, 0, 410, 310
		WinSet Style, -0x800000, Оконный проектор (Источник) - Вебка ;
		WinSet Style, -0x40000, Оконный проектор (Источник) - Вебка ;
		WinSet Style, -0x400000, Оконный проектор (Источник) - Вебка ;
		УжеНажимали := true
	}

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

10

Re: Открытие окна поверх игры, оверлей

stealzy
Спасибо большое! Игры теперь не переключаются на второй план и скрипт работает как надо!
Знаю, достал я уже с вопросами, в документации подобного не нашел (или слепой), так вот, хотел бы еще это окошко отзеркалить (по горизонтали), такое вообще возможно средствами AHK?

11

Re: Открытие окна поверх игры, оверлей

stealzy
В этом как бы и дело, что именно в предпросмотре ОБСа (то, что записывается на видео), у меня всё отзеркалено как надо, а всё что проделовалось в данной теме, это с отдельным окошком "источник", которое какого-то хрена зеркалиться вместе с основным окном предпросмотра не хочет (тупо нету такой функции для источников).
Ну да ладно, это не так критично, наверное забью на это дело.
Я нашел интересную штуку, точнее дописал к своему скрипту, чтобы игры, где не предусмотрен режим "окно без рамок", устанавливал мой скрипт в самом начале.

	BorderSize:=3
    WinMove, ahk_exe FarCryNewDawn.exe,, -BorderSize, -BorderSize, 2048+2*BorderSize, 1152+2*BorderSize

Она работает, вроде нормально, по крайней мере в играх, где нету режима "окно без рамок", в играх, где такой режим есть, возникают проблемы, но можно его и в игре ставить в ручную, не критично.
Так вот, хотелось бы реализовать небольшую ГУИшку, для удобства, игр у меня много разных, и список постоянно обновляется. Мне необходимо сделать всего 2 вещи, выбор процесса (желательно во всплывающем меню) [в идеале, чтобы он автоматически находил нужный процесс в игрой (но это уже, я многого хочу )] и чтобы процесс, который я выбрал вставлялся в вышеуказанном коде на место ЕХЕшника.
И да, посмотрите, пожалуйста, реализацию самой системы антирамок для игр, возможна она у меня прописана не лучшем способом.
Заранее огромное спасибо за Вашу помощь, вы реально помогаете, и я потихоньку начинаю в этом разбираться
Если что, полный код:

F9:: 
 	If Not УжеНажимали2       
;	{	
;		BorderSize:=3
       WinMove, ahk_exe FarCryNewDawn.exe,, -BorderSize, -BorderSize, 2048+2*BorderSize, 1152+2*BorderSize
;		WinSet, Style, -0xC00000, ahk_exe FarCryNewDawn.exe ; убрать рамку
;		WinMove ahk_exe FarCryNewDawn.exe,, -10, -33, 1920, 1080
;		WinSet Style, -0x800000, Far Cry ® New Dawn ;
;		WinSet Style, -0x40000, Far Cry ® New Dawn ;
;		WinSet Style, -0x400000, Far Cry ® New Dawn ;
		УжеНажимали2 := true
	}

	If Not УжеНажимали
	{
		WinMove Оконный проектор (Источник) - Вебка,, 1510, 0, 410, 310
		WinSet Style, -0x800000, Оконный проектор (Источник) - Вебка ;
		WinSet Style, -0x40000, Оконный проектор (Источник) - Вебка ;
		WinSet Style, -0x400000, Оконный проектор (Источник) - Вебка ;
		УжеНажимали := true
	}

	IfWinExist ahk_class Qt5152QWindowIcon ahk_exe obs64.exe
	{
		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

12

Re: Открытие окна поверх игры, оверлей

stealzy
Не лень, просто когда что-то начал, всегда иду до конца. Хоткей тоже пойдет, но, в виду того, что у меня итак уже куча хоткеев на совершенно другие функции, это банально уже мешает, и хочу перейти плавно к переносу скриптов с хоткеями к скриптам с гуи.

13

Re: Открытие окна поверх игры, оверлей

Michael

Кому как удобно - пускай и делает. Я лично на F-клавиши кучу действий понаставил, но сделал привязку к окнам либо к группе. Таким образом в нескольких играх клавиша F5 сделает окно мелким, F6 сделает обратно на весь экран. Полезно когда нужно видеть запуск мачта, который начинается не сразу.
Другими словами - легче сделать одну функцию / метку затем использовать её в разных окнах. Меньше строк, легко изменить / добавить что-то.

14

Re: Открытие окна поверх игры, оверлей

__Михаил__
А возможно ли мгновенное переключение из полноэкранного режима [в игре] в "окно без рамок" (через код в АХК, естественно, а не через настройки игры, где такое присутствует)

15

Re: Открытие окна поверх игры, оверлей

Michael

Сомневаюсь что такое возможно.

16 (изменено: Michael, 2021-01-16 15:09:32)

Re: Открытие окна поверх игры, оверлей

__Михаил__
У меня стало криво работать "окно без рамок" во многих играх.
Вообще не убирает рамку:

   BorderSize:=3
   WinMove, ahk_exe FarCryNewDawn.exe,, -BorderSize, -BorderSize, 2048+2*BorderSize, 1152+2*BorderSize

Убирает рамку, но, во первых, игра чуть уходит вниз, оставляя сверху видимым рабочий стол, во вторых саму игру делает кривой в плане нажатий, кликать надо чуть выше над любой кнопкой в игре, чтобы ее нажать:

		WinSet Style, -0x800000, Far Cry ® New Dawn ;
		WinSet Style, -0x40000, Far Cry ® New Dawn ;
		WinSet Style, -0x400000, Far Cry ® New Dawn ;

У вас вроде похожие коды, судя по тому, что писали выше, поможете разобраться?

UPDATE!
Я идиот

		BorderSize:=0
	    WinMove, ahk_exe SRTTR.exe,, -BorderSize, -BorderSize, 1920+2*BorderSize, 1080+2*BorderSize
		WinSet, Style, -0xC00000, ahk_exe SRTTR.exe

17

Re: Открытие окна поверх игры, оверлей

Michael

У меня немного иначе код, более простой и корявый - т.к. писал давно.

F5:: Goto IF_win_Hide	; Свернуть игру
F6:: Goto IF_win_A64	; Развернуть игру


; Уменьшить игру, фокус на раб. стол:
;14.07.2019	+повторное сворачивание, подстройка по классу
IF_win_Hide:
WinGetClass, class, A
T=%class%
WinMove, ahk_class %T%,, 0, 0, 384, 216

;WinMove, ahk_class %T%,, 0, 0, 240, 160
;WinMove, ahk_class %T%,, 0, 0, 400, 250

;WinMove, ahk_class GEMAINWINDOWCLASS,, 0, 0, 400, 250
;WinMove, ahk_class LaunchUnrealUWindowsClient,, 0, 0, 100, 200
KeyWait, %A_ThisHotkey%
Sleep, 200
WinActivate, ahk_class Progman
MouseMove, 900, 550, 0
Gosub, фокус

;05:11 14.07.2019	Свернуть повторно если не вышло:
Sleep, 1000
WinGetClass, class, A
If (class = T)
{
 ToolTip, Повторно свернуть..`n%class% %T%,0,0
 WinMove, ahk_class %T%,, 0, 0, 384, 216
 Sleep, 1000
 ToolTip
}
Return



; Активация игры, Отображение датчиков:
IF_win_A64:
WinActivate, ahk_class TForm_HWMonitoringSensorPanel
WinSet, AlwaysOnTop, toggle, ahk_class TForm_HWMonitoringSensorPanel
WinActivate, ahk_class GEMAINWINDOWCLASS		; Ring of Elysium
WinActivate, ahk_class LaunchUnrealUWindowsClient
WinActivate, ahk_class Nomad		; Far Cry


;20:09 25.09.2019	развернуть окно на весь дисплей
WinGetClass, class, A

;19:12 03.10.2019 Защита от полноэкранного отображения панели.
If class = TForm_HWMonitoringSensorPanel
 Return

ToolTip, %class%, 0,0
WinMove, ahk_class %class%,, 0, 0, 1920, 1080
Sleep, 1000
ToolTip

KeyWait, %A_ThisHotkey%
Return




фокус:
MouseGetPos, , , id
WinGetClass, class, ahk_id %id%
	;Получаем имя окна:
WinGetTitle, Title, ahk_id %id%
	;Активируем окно по иду:
WinActivate, ahk_id %id%
Return

18

Re: Открытие окна поверх игры, оверлей

__Михаил__
В общем, я наконец-таки понял, что примерно мне осталось доделать.
1. Проверка, в окне ли игра.
1.1. Если да, запустить следующее:

		BorderSize:=0
	    WinMove, ahk_exe SRTTR.exe,, -BorderSize, -BorderSize, 1920+2*BorderSize, 1080+2*BorderSize
		WinSet, Style, -0xC00000, ahk_exe SRTTR.exe

1.2. Если нет, запустить примерно такое [Нажатие клавиш Альт+Энтер] (Игра не понимает мой скрипт, где-то косяки):

		WinWait, ahk_exe SRTTR.exe
     {
        ControlSend, {LAlt}+{enter}, ahk_exe SRTTR.exe
     }

Как это реализовать, пока что не понимаю

19

Re: Открытие окна поверх игры, оверлей

Michael

Так отправить Alt+Enter:

Send !{Enter}

20 (изменено: Michael, 2021-01-16 21:19:04)

Re: Открытие окна поверх игры, оверлей

__Михаил__
Работает. Сейчас мучаюсь над своим первым пунктом, как проверить, то, что игра в окне или нет

UPDATE!
Вышеописанное уже не нужно, ибо вот работает с рамкой так как нужно уже это: (кроме игр с уже встроенным режимом без рамок, так это уже не нужно)

F9:: 
 	If Not ОкноБезРамокДляИгр       
	{	
		BorderSize:=0
	    WinMove, ahk_exe MK11.exe,, -BorderSize, -BorderSize, 1920+2*BorderSize, 1080+2*BorderSize
		WinSet, Style, -0xC00000, ahk_exe MK11.exe ; убрать рамку
		ОкноБезРамокДляИгр := true
	}

Осталось последнее узнать, что реально нужно, чтобы весь мой полный скрипт был до конца проработан.
Так вот, ГУИшка, с одной лишь задачей, отображение запущенных процессов в ListBox, и по нажатию клавиши Ок, в скрипте прописывается нужный EXEшник в 2х местах.
То, что пока что навоял (чисто визуал):

#SingleInstance Force
#NoEnv
SetWorkingDir %A_ScriptDir%
SetBatchLines -1

Gui Add, ListBox, x14 y8 w120 h251, Выбрать процесс...
Gui Add, Button, x13 y265 w121 h23, Ок

Gui Show, w148 h304, WebCam Overlay
Return

GuiEscape:
GuiClose:
    ExitApp

21

Re: Открытие окна поверх игры, оверлей

F2::	; Отобразит 1, если окно на весь экран.
ToolTip, % ActiveAppFullScreen()
KeyWait, %A_ThisHotkey%, U	; Ждать отпуска клавиши.
ToolTip
Return


;[YMP] 23.02.2017	http://forum.script-coding.com/viewtopic.php?pid=113119#p113119
ActiveAppFullScreen()
{
    static SM_CXSCREEN := 0, SM_CYSCREEN := 1, Rect
    hwndActive := WinExist("A")
    WinGetClass, classActive, ahk_id %hwndActive%
    If (classActive = "WorkerW" || classActive = "Shell_TrayWnd")
        Return False
    VarSetCapacity(Rect, 16)
    DllCall("GetClientRect", "Ptr", hwndActive, "Ptr", &Rect)
    width := NumGet(Rect, 8, "UInt")
    height := NumGet(Rect, 12, "UInt")
    SysGet, fs_width, %SM_CXSCREEN%
    SysGet, fs_height, %SM_CYSCREEN%
    Return (width = fs_width) &&  (height = fs_height)
}

22

Re: Открытие окна поверх игры, оверлей

Код, который я сам придумал когда была нужна проверка полно-экранности окна:

F2::	; Ненадёжный, короткий код:
ToolTip, % Get_Full()
KeyWait, %A_ThisHotkey%, U
ToolTip
Return

Get_Full()
{
 WinGetPos,,,W,H, A
 Mon := A_ScreenWidth + A_ScreenHeight	 ;Размеры экрана
 If (W+H = Mon)
  Return 1
 Return 0
}

23

Re: Открытие окна поверх игры, оверлей

__Михаил__
Спасибо за эту полезную вещь, но сейчас сосредоточусь на ГУИшке, ибо дело подходит постепенно к концу.
Не подскажите как вывести запущенные процессы в ListBox с возможностью выбора? Постом выше [http://forum.script-coding.com/viewtopi … 93#p144893] описал поподробнее.

24

Re: Открытие окна поверх игры, оверлей

__Михаил__
У меня пошел прогресс, удалось сделать лист с открытыми процессами, осталось как-то выбираемый в этом листе ЕХЕшник привязать к кнопке ОК и основному скрипту, чтобы менялся ЕХЕшник.
Код моего ГУИ:

#SingleInstance Force
#NoEnv
SetWorkingDir %A_ScriptDir%
SetBatchLines -1

Gui Add, ListView, x14 y8 w120 h251, Выбрать процесс...
Gui Add, Button, x13 y265 w121 h23, Ок

for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
    LV_Add("", process.Caption)
LV_ModifyCol()

Gui, Show,, Process List
Gui Show, w148 h304, WebCam Overlay
Return

GuiEscape:
GuiClose:
    ExitApp

Код всего остального:

F9:: 
 	If Not ОкноБезРамокДляИгр       
	{	
		BorderSize:=0
	    WinMove, ahk_exe MK11.exe,, -BorderSize, -BorderSize, 1920+2*BorderSize, 1080+2*BorderSize
		WinSet, Style, -0xC00000, ahk_exe MK11.exe ; убрать рамку
		ОкноБезРамокДляИгр := true
	}

	If Not ОкноБезРамокДляВебки
	{
		WinMove Оконный проектор (Источник) - Вебка,, 1510, 0, 410, 310 ; перемещаем окошко в угол + ресайз
		WinSet Style, -0x800000, Оконный проектор (Источник) - Вебка ; -рамка
		WinSet Style, -0x40000, Оконный проектор (Источник) - Вебка ; -рамка
		WinSet Style, -0x400000, Оконный проектор (Источник) - Вебка ; -рамка
		ОкноБезРамокДляВебки := true
	}

	IfWinExist ahk_class Qt5152QWindowIcon ahk_exe obs64.exe
	{
		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

25

Re: Открытие окна поверх игры, оверлей

Michael

Вот так можно получить выделенный пункт.

Gui, Add, Listbox, vG1 gOk hwndhListbox x14 y8 w120 h251

for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
 Txt .= Process.Caption "|"

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

Gui, Add, Button, gOk w121 h23, Ок
Gui, Show, w148 h304, WebCam Overlay
Return


Ok:
Gui, Submit, NoHide
If G1
 ToolTip, Выделен пункт: %G1%
Return

GuiEscape:
GuiClose:
ExitApp

26 (изменено: Michael, 2021-01-16 23:07:38)

Re: Открытие окна поверх игры, оверлей

__Михаил__
Огромное спасибо! Всё работает! [ToolTip] убрал только, ибо мешает, поверх игры отображается.
Думаю, как теперь реализовать удобный поиск по процессам, либо в отдельном окошке поиск запилить с вводом, либо, проще всего, думаю сделать, чтобы список процессов отображался по принципу "сверху самые последние запущенные процессы, снизу - давно запущенные". Только не знаю, как это сделать средствами ListView и где вообще копать
Итоговый код:

#SingleInstance Force
#NoEnv
SetWorkingDir %A_ScriptDir%
SetBatchLines -1

Gui, Add, Listbox, vG1 gOk hwndhListbox x20 y20 w150 h250,

for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
 Txt .= Process.Caption "|"

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

Gui, Add, Button, gOk w150 h20, Ок
Gui, Show, w300 h300, WebCam Overlay
Return


Ok:
Gui, Submit, NoHide
Return

F9:: 
 	If Not ОкноБезРамокДляИгр       
	{	
		BorderSize:=0
	    WinMove, ahk_exe %G1%,, -BorderSize, -BorderSize, 1920+2*BorderSize, 1080+2*BorderSize
		WinSet, Style, -0xC00000, ahk_exe %G1% ; убрать рамку
		ОкноБезРамокДляИгр := true
	}

	If Not ОкноБезРамокДляВебки
	{
		WinMove Оконный проектор (Источник) - Вебка,, 1510, 0, 410, 310 ; перемещаем окошко в угол + ресайз
		WinSet Style, -0x800000, Оконный проектор (Источник) - Вебка ; -рамка
		WinSet Style, -0x40000, Оконный проектор (Источник) - Вебка ; -рамка
		WinSet Style, -0x400000, Оконный проектор (Источник) - Вебка ; -рамка
		ОкноБезРамокДляВебки := true
	}

	IfWinExist ahk_class Qt5152QWindowIcon ahk_exe obs64.exe
	{
		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

GuiEscape:
GuiClose:
    ExitApp

27

Re: Открытие окна поверх игры, оверлей

Michael

Примерно такой вариант поиска. Не самый лучший, но рабочий:

Name = Выбор процесса...

GroupAdd, AppGroup, % Name

Gui Add, Edit, gGet vPoisk x8 y16 w200 h21, Поиск...	; Ищет сразу, если не нужно убрать 'gGet'.
Gui Add, ListBox, vG1 gOk hwndhListbox x8 y40 w200 h160
Gui Add, Button, x8 y208 w80 h23, OK


for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
 Txt .= Process.Caption "|"

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

Gui Show, w216 h236, % Name
Return

GuiEscape:
GuiClose:
ExitApp


#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, Найдено: %T%,0,0
Else
 ToolTip, Нет такого.,0,0
Sleep, 400
ToolTip
Return


Ok:
Gui, Submit, NoHide
Return

28

Re: Открытие окна поверх игры, оверлей

__Михаил__
Работает, как часы. Только мне кажется я мудрить сильно начинаю...)
А возможно ли как то сделать сортировку в ListBox обратно? Сейчас он мне показывает, снизу самые свежезапущенные процессы, а сверху старые. А мне надо наоборот
Либо, если такое возможно, сделать еще проще, мол, в ГУИ 1 кнопка: Запустить, жмем ее, начался процесс отслеживания файла, который я запущу первым после нажатия данной кнопки, и ЕХЕшник данного приложения записывается в ту же переменную. Реально такое вообще? Или я много хочу от AHK?

29

Re: Открытие окна поверх игры, оверлей

Michael

Всё описанное возможно, только зачем?
Нажать одну клавишу, которая соберёт инфу о текущем окне и выполнит какое-либо действие - куда проще на мой взгляд. Например Win, она мало для чего пригодна, если уже занята, то можно повесить сочетание с ней - Win+1 и т.д.

30

Re: Открытие окна поверх игры, оверлей

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

ГУИ 1 кнопка: Запустить, жмем ее, начался процесс отслеживания файла, который я запущу первым после нажатия данной кнопки, и ЕХЕшник данного приложения записывается в ту же переменную

31

Re: Открытие окна поверх игры, оверлей

Michael

Думаю придётся писать свой код. Как получить список всех запущенных в этой теме уже есть. Осталось сделать сравнение старого списка с новым, когда произойдёт отсев - будет нужная, новая программа.

32 (изменено: __Михаил__, 2021-01-17 16:47:16)

Re: Открытие окна поверх игры, оверлей

Michael

Если нужен реверс списка. Правда при этом идёт сортировка.

#SingleInstance Force
#NoEnv
SetBatchLines -1

Name = Выбор процесса...

GroupAdd, AppGroup, % Name

; Ищет сразу, если не нужно убрать 'gGet'. Enter - для применения поиска.
Gui Add, Edit, gGet vPoisk x8 y16 w200 h21, Поиск...
Gui Add, ListBox, vG1 hwndhListbox x8 y40 w200 h160
Gui Add, Button, gReverse x8 y208 w80 h23, Реверс

for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
 Txt .= Process.Caption "|"

GuiControl,, % hListbox, % Txt	; Вставить из переменной.
Gui Show, w216 h236, % Name
Return

GuiEscape:
GuiClose:
ExitApp


#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


Ok:
Gui, Submit, NoHide
Return

Reverse:
Reverse := !Reverse
Txt = 
for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
 Txt .= Process.Caption "|"

If Reverse
 Sort, Txt, R D|

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

33 (изменено: Michael, 2021-01-17 18:19:15)

Re: Открытие окна поверх игры, оверлей

__Михаил__
Реверс это конечно хорошо, но его сортировка меня убила

Осталось сделать сравнение старого списка с новым, когда произойдёт отсев - будет нужная, новая программа.

Осталось только понять, где вообще смотреть примеры этого "сравнения" и как сделать отсев. Единственное что нарыл пока-что - http://forum.script-coding.com/viewtopic.php?id=14701. Но, не понимаю, это к диспетчеру задач и сравнению процессов можно ли как-то прикрутить вообще...

UPDATE:
Нашел вот такой вот скрипт от serzh82saratov: (вроде мне что-то типо этого надо, но не могу в нем разобраться и понять как туда засунуть список процессов

D := A_Tab

Data_base = Все	что	удалось	сделать	на	текущий	момент:	в	приведенном	ниже	коде	идет	построчное	сравнение	списка	из	файла
Ordinar = Такого там нет	удалось	сравнение	файла

Loop, Parse, Ordinar, %D%
	MsgBox % "Строка: """ A_LoopField """`n`n" (InStr(D Data_base D, D A_LoopField D) ? "Есть" : "Нет") " - в Data_base"

34

Re: Открытие окна поверх игры, оверлей


old = smss.exe|csrss.exe|wininit.exe|services.exe|lsass.exe|svchost.exe|WUDFHost.exe|fontdrvhost.exe
new = new 2.exe|smss.exe|csrss.exe|wininit.exe|new 1.exe|services.exe
 
D = |

Loop, Parse, new, %D%
	If !InStr(D old D, D A_LoopField D)
		MsgBox % A_LoopField
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

35

Re: Открытие окна поверх игры, оверлей

Michael

Вот так находит, только 1 программу.

#SingleInstance Force
#NoEnv
SetBatchLines -1

Name = Выбор процесса...

GroupAdd, AppGroup, % Name

; Ищет сразу, если не нужно убрать 'gGet'. Enter - для применения поиска.
Gui Add, Edit, hwndhSear gGet vPoisk x8 y16 w200 h21, Поиск...
Gui Add, ListBox, vG1 hwndhListbox x8 y40 w200 h160
Gui Add, Button, gReverse x8 y208 w80 h23, Реверс
Gui Add, Button, gNewApp hwndhBut x96 y208 w100 h23, Новая прога

for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
 Txt .= Process.Caption "|"

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

Gui Show, w216 h236, % Name
Return

GuiEscape:
GuiClose:
ExitApp


#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


Ok:
Gui, Submit, NoHide
ToolTip, Пункт: %G1%
Return


Reverse:
Reverse := !Reverse
GoSub, App

If Reverse
 Sort, Txt, R D|

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


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


NewP:	; Отсев новых программ.
GoSub, App
Txt_New = 
D = |
Loop, Parse, Txt, %D%
{
 If !InStr(D Txt2 D, D A_LoopField D)
  Txt_New := A_LoopField "|"
}
If Txt_New
{
 Txt := Txt_New
 SetTimer, NewP, Off		; Выключить тестер.
 GuiControl,, % hListbox, |	; Очистить список.
 GuiControl,, % hListbox, % Txt_New	; Вставить из переменной.
 GuiControl, Enable, % hBut	; Разблок кнопки.
 GuiControl, Enable, % hSear	; Разблок поиска.
}
Return


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

36

Re: Открытие окна поверх игры, оверлей

serzh82saratov
Благодарю!

__Михаил__
Большое спасибо! Собственно, все работает, запускаемое окно с игрой он находит, но есть один нюанс, иногда нужно дважды/трижды выполнять поиск, т.к. иногда вместо игрового процесса отображается audiodg.exe (не понимаю, почему)
Начал доработку ГУИ и скрипта под свои нужды, возникла еще одна проблемка
Сделал кнопку, для запуска ОБСки, но она выдает ошибку при запуске. С кнопкой всё отлично, и другие ЛЮБЫЕ программы стартуют прекрасно, кроме неё. С правами админа - тоже самое.
Нарыл похожую проблему у человека https://github.com/obsproject/obs-studio/issues/2966

Это ожидаемо, мы не поддерживаем запуск заданий из-за пределов текущего рабочего каталога

Можно как-то это дело обойти?
Текущий полный скрипт с изменениями: (если кому интересно)

#SingleInstance Force
#NoEnv
SetBatchLines -1

Name = Cam OverLay

GroupAdd, AppGroup, % Name


;Gui +ToolWindow
Gui Add, Button, x125 y50 w102 h23, Подтвердить
Gui Add, ListBox, vG1 gПодтвердить hwndhListbox x25 y151 w196 h160
Gui Add, Button, gNewApp hwndhBut x125 y19 w102 h23, Отследить игру
Gui Add, Button, gGames x15 y19 w102 h23, Папка GAMES
Gui Add, Button, gOBS x15 y50 w102 h23, Запустить OBS
Gui Add, Button, gReverse x125 y104 w102 h23, Реверс
Gui Add, Text, x18 y90 w210 h2 +0x10
Gui Add, GroupBox, x18 y134 w211 h188, Выбрать процесс
Gui Add, Edit, hwndhSear gGet vPoisk x17 y105 w100 h21, Поиск процесса...
;Gui Add, Edit, gGet vPoisk x8 y16 w200 h21, Поиск...	; Ищет сразу, если не нужно убрать 'gGet'.
;Gui Add, ListBox, vG1 gOk hwndhListbox x8 y40 w200 h160
;Gui Add, Button, x8 y208 w80 h23, OK


for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
 Txt .= Process.Caption "|"

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

Gui Show, w246 h340, % Name
Return

GuiEscape:
GuiClose:
ExitApp

Games:
Run, C:\Users\Администратор\Desktop\Games

OBS:
Run, C:\Program Files\obs-studio\bin\64bit\obs64.exe

#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


Подтвердить:
Gui, Submit, NoHide
;ToolTip, Пункт: %G1% ; отображение выбранного пункта
Return


Reverse:
Reverse := !Reverse
GoSub, App

If Reverse
 Sort, Txt, R D|

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


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


NewP:	; Отсев новых программ.
GoSub, App
Txt_New = 
D = |
Loop, Parse, Txt, %D%
{
 If !InStr(D Txt2 D, D A_LoopField D)
  Txt_New := A_LoopField "|"
}
If Txt_New
{
 Txt := Txt_New
 SetTimer, NewP, Off		; Выключить тестер.
 GuiControl,, % hListbox, |	; Очистить список.
 GuiControl,, % hListbox, % Txt_New	; Вставить из переменной.
 GuiControl, Enable, % hBut	; Разблок кнопки.
 GuiControl, Enable, % hSear	; Разблок поиска.
}
Return

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

F9:: 
 ;	If Not ОкноБезРамокДляИгр       
	{	
		BorderSize:=0
	    WinMove, ahk_exe %G1%,, -BorderSize, -BorderSize, 1920+2*BorderSize, 1080+2*BorderSize
		WinSet, Style, -0xC00000, ahk_exe %G1% ; убрать рамку
;		ОкноБезРамокДляИгр := true
	}

;	If Not ОкноБезРамокДляВебки
	{
		WinMove Оконный проектор (Источник) - Вебка,, 1510, 0, 410, 310 ; перемещаем окошко в угол + ресайз
		WinSet Style, -0x800000, Оконный проектор (Источник) - Вебка ; -рамка
		WinSet Style, -0x40000, Оконный проектор (Источник) - Вебка ; -рамка
		WinSet Style, -0x400000, Оконный проектор (Источник) - Вебка ; -рамка
;		ОкноБезРамокДляВебки := true
	}

	IfWinExist ahk_class Qt5152QWindowIcon ahk_exe obs64.exe
	{
		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

37

Re: Открытие окна поверх игры, оверлей

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

Вот так находит, только 1 программу.

Не одну, а последнюю не совпавшую.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

38

Re: Открытие окна поверх игры, оверлей

Michael пишет:

не поддерживаем запуск заданий из-за пределов текущего рабочего каталога

У команды Run есть параметр WorkingDir.
Не знаю почему, но по умолчанию используется директория скрипта, а не запускаемой программы.

0xFFFFFF
0xFF0000
0xFFFFFF

39

Re: Открытие окна поверх игры, оверлей

stealzy
Благодарю! Теперь всё запускается, остальные команды работают также на УРА! Еще и вебку отразил, как нужно, кайф

Итоговый скрипт (может кому-то будет полезно):

#SingleInstance Force
#NoEnv
SetBatchLines -1

Name = Cam OverLay

GroupAdd, AppGroup, % Name


;Gui +ToolWindow
Gui Add, Button, x125 y50 w102 h23, Подтвердить
Gui Add, ListBox, vG1 gПодтвердить hwndhListbox x25 y151 w196 h160
Gui Add, Button, gNewApp hwndhBut x125 y19 w102 h23, Отследить игру
Gui Add, Button, gGames x15 y19 w102 h23, Папка GAMES
Gui Add, Button, gOBS x15 y50 w102 h23, Запустить OBS
Gui Add, Button, gReverse x125 y104 w102 h23, Реверс
Gui Add, Text, x18 y90 w210 h2 +0x10
Gui Add, GroupBox, x18 y134 w211 h188, Выбрать процесс
Gui Add, Edit, hwndhSear gGet vPoisk x17 y105 w100 h21, Поиск процесса...


for Process in ComObjGet("Winmgmts:").ExecQuery("Select * From Win32_Process")
 Txt .= Process.Caption "|"

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

Gui Show, w246 h340, % Name
Return

GuiEscape:
GuiClose:
ExitApp

Games:
Run, C:\Users\Администратор\Desktop\Games
Return

OBS:
Run, C:\Program Files\obs-studio\bin\64bit\obs64.exe, C:\Program Files\obs-studio\bin\64bit\
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


Подтвердить:
Gui, Submit, NoHide
;ToolTip, Пункт: %G1% ; отображение выбранного пункта
Return


Reverse:
Reverse := !Reverse
GoSub, App

If Reverse
 Sort, Txt, R D|

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


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


NewP:	; Отсев новых программ.
GoSub, App
Txt_New = 
D = |
Loop, Parse, Txt, %D%
{
 If !InStr(D Txt2 D, D A_LoopField D)
  Txt_New := A_LoopField "|"
}
If Txt_New
{
 Txt := Txt_New
 SetTimer, NewP, Off		; Выключить тестер.
 GuiControl,, % hListbox, |	; Очистить список.
 GuiControl,, % hListbox, % Txt_New	; Вставить из переменной.
 GuiControl, Enable, % hBut	; Разблок кнопки.
 GuiControl, Enable, % hSear	; Разблок поиска.
}
Return

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

F9:: 
 ;	If Not ОкноБезРамокДляИгр       
	{	
		BorderSize:=0
	    WinMove, ahk_exe %G1%,, -BorderSize, -BorderSize, 1920+2*BorderSize, 1080+2*BorderSize
		WinSet, Style, -0xC00000, ahk_exe %G1% ; убрать рамку
;		ОкноБезРамокДляИгр := true
	}

;	If Not ОкноБезРамокДляВебки
	{
		WinMove Оконный проектор (Источник) - Вебка,, 0, 0, 408, 308 ; перемещаем окошко в угол + ресайз
		WinSet Style, -0x800000, Оконный проектор (Источник) - Вебка ; -рамка
		WinSet Style, -0x40000, Оконный проектор (Источник) - Вебка ; -рамка
		WinSet Style, -0x400000, Оконный проектор (Источник) - Вебка ; -рамка
;		ОкноБезРамокДляВебки := true
	}

	IfWinExist ahk_class Qt5152QWindowIcon ahk_exe obs64.exe
	{
		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

40

Re: Открытие окна поверх игры, оверлей

serzh82saratov
В текущем состоянии 'одну программу' - я это и имел в виду.

Michael
Можно добавить список исключений, но легче будет переделать на постоянный отсев пока не нажата клавиша 'Стоп'.

41

Re: Открытие окна поверх игры, оверлей

__Михаил__
Можно добавить, но, думаю, это уже лишнее, скрипт работает так, как нужно, затрачивая минимум времени и добавляя удобство.
Сейчас хочу начать еще один небольшой проектик "Поиск на Ютубе / Хром", но, видимо, мне тут уже не рады

42

Re: Открытие окна поверх игры, оверлей

Michael

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

43

Re: Открытие окна поверх игры, оверлей

__Михаил__
Я с предоставленным кодом то еще не до конца разобрался, какой мне отсев