1

Тема: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

Есть нужда по быстрому скритию\раскрытию активного окна в определенной программе.
Программа FL studio 20. Внутри нее открываются плагины в виде окна. В связи с очень небольшим монитором, и необходимостью одновременного открытия нескольких окон/плагинов, нужно постоянно кликать в угол по кнопкам свернуть/восстановить, была задумка это сделать с помощью AHK, но выяснилось, что все внутри FL Studio пренадлежит одному и тому же akk_class, меняется у окона внутри FL  только ClassNN. Можно ли как то WinClose или WinMinimize научить работать с ClassNN? Или как то иначе решить задачу?

Скрин WinSpy:

+ открыть спойлер

https://i.imgur.com/nytGTMl.png

2

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

Почему бы не ориентироваться на название окна?

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

3

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

С помощью этого кода, можно получить различную инфу об окне.

Set := A_Desktop "\Info.ini"
D := ":"
D1 := "."


F2::
Time := A_Hour D A_Min D A_Sec " " A_DD D1 A_MM D1 A_YYYY
ID := WinExist("A")
WinGetPos, X, Y, W, H, ahk_id %id%
WinGetTitle, Title, ahk_id %id%
WinGet, PID, PID, ahk_id %id%
WinGetClass, Class, ahk_id %id%
WinGet, Exe, ProcessName, ahk_id %id%
GCL := Proc(PID)

WinGet, WinProcessPath, ProcessPath, ahk_id %id%
Loop, %WinProcessPath%
 WinProcessPath = %A_LoopFileLongPath%

IniWrite, % Title, % Set, % Time, Title
IniWrite, % PID, % Set, % Time, PID
IniWrite, % Class, % Set, % Time, Class
IniWrite, % Exe, % Set, % Time, Exe
IniWrite, % X ", " Y ", " W ", " H , % Set, % Time, Position
IniWrite, % WinProcessPath , % Set, % Time, WinProcessPath
IniWrite, % GCL, % Set, % Time, CommandLine
Return



Proc(pid){
 wmi := ComObjGet("winmgmts:")
 queryEnum := wmi.ExecQuery("" . "Select * from Win32_Process where ProcessId=" . PID)._NewEnum()
 If queryEnum[proc]
  line := proc.CommandLine
 Else
  line = Process not found!
 Return line
}

Запускаем скрипт, открываем нужное окно, жмём F2 в окне. Повторить во всех нужных окнах с интервалом от 1 секунды.
На раб. столе появится *.ini файл с инфой об окнах.

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

4

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

teadrinker пишет:

Почему бы не ориентироваться на название окна?

Названия окон менются в зависимости от названия содержания.

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

С помощью этого кода, можно получить различную инфу об окне.

Ничего нового не показало. Тоже показывает winspy.

У всех внутренних окон classNN:TNewCaption1. Если окно активное, у неактивных classNN:TNewCaption2.

5

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

Ну должно же хоть что-то отличаться, покажите файл.ini с инфой двух и более окон в которых нужно найти отличия.

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

6 (изменено: sim8783, 2021-03-21 12:54:52)

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

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

Ну должно же хоть что-то отличаться, покажите файл.ini с инфой двух и более окон в которых нужно найти отличия.

Вот:

+ открыть спойлер

[01:35:52 21.03.2021]
Title=NextGen.flp - FL Studio 20
PID=6984
Class=TFruityLoopsMainForm
Exe=FL64.exe
Position=62, 0, 1378, 900
WinProcessPath=S:\ProgramFast\FL Studio 20\FL64.exe
CommandLine="S:\ProgramFast\FL Studio 20\FL64.exe"
[01:35:59 21.03.2021]
Title=NextGen.flp - FL Studio 20
PID=6984
Class=TFruityLoopsMainForm
Exe=FL64.exe
Position=62, 0, 1378, 900
WinProcessPath=S:\ProgramFast\FL Studio 20\FL64.exe
CommandLine="S:\ProgramFast\FL Studio 20\FL64.exe"
[01:36:07 21.03.2021]
Title=NextGen.flp - FL Studio 20
PID=6984
Class=TFruityLoopsMainForm
Exe=FL64.exe
Position=62, 0, 1378, 900
WinProcessPath=S:\ProgramFast\FL Studio 20\FL64.exe
CommandLine="S:\ProgramFast\FL Studio 20\FL64.exe"

У окон отличается classNN.

7

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

Тяжёлый случай. В такой ситуации наверно только че6рез Acc различать, я в этом не силён.

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

8

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

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

Тяжёлый случай. В такой ситуации наверно только че6рез Acc различать, я в этом не силён.

Жаль. Я бы не сказал даже, что прямо необходимо отличать окна, важно просто мочь отправлять команду сворачивания\разворачивания в активное окно, но только активное в программе, а не в целом, что бы не саму FL Studio сворачивало, а окно внутри.

9 (изменено: __Михаил__, 2021-03-21 15:20:01)

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

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

T := "NextGen.flp - FL Studio 20"

F5::
WinGetTitle, Title, A
If (Title = T)
 WinMinimize, A
Return
Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

10

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

У каждого окна и у каждого элемента управления в каждом окне существует уникальный идентификатор. Зовётся HWND.

11

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

ypppu пишет:

У каждого окна и у каждого элемента управления в каждом окне существует уникальный идентификатор. Зовётся HWND.

Работает только с функцией "Detached" у окна. Т.к. когда оно обособлено, у него появляются особые характеристики. Но при этой функции пропадает возможность переключения между окнами по клавише Tab, что крайне важная для меня функция.
Видимо задача не решаема.

12

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

Видимо, в этом режиме не существует дополнительных окон. Просто их содержимое внедряется в основное окно под видом вкладок (вроде ещё говорят "док-панель").
Ну, как вариант, можно средствами AutoHotkey кликать мышкой по координатам для переключения между этими "вкладками".

13

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

ypppu пишет:

Ну, как вариант, можно средствами AutoHotkey кликать мышкой по координатам для переключения между этими "вкладками".

Я бы сразу так сделал, но для кликов тоже нужны какие то определенные ориентиры, т.к. "окна" всегда в разных местах и разном маштабе, с разными названиями. Приходит на ум только imageSearch, либо брать заголовки каждого окна, вычислять у них начало, так как оно обычно одинаковое, но тут опять же снова эта задача, как брать заголовки, если окно никак не индентифицируется, снова через imageSearch только. Но хотелось бы универсального решения, что бы не подгонять под определенные окна. Вообщем это край, пока не на столько это необходимо, что бы идти на такой компромис.

Еще подумал о перехвате команды, которая посылается при клике на модификаторы окна, или той же кнопки "Detached"которая не имеет горячей клавиши. Можно ли таким образом провернуть, типа реверснуть через ollydbg например, и привезать посыл команды к AHK? Был бы презнателен ссылкам на подобные примеры, если есть у кого на памяти сейчас откликнулось.

14

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

Перебирайте все TNewCaption, которое больше остальных, кликайте в правый верхний угол, или где там кнопка свернуть. Насчёт разворчивания, не знаю, надо больше данных. Для наглядности я бы использовал ahkspy и window detective, то что пишет в ини файл, очень странный выбор.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

serzh82saratov пишет:

Перебирайте все TNewCaption, которое больше остальных, кликайте в правый верхний угол, или где там кнопка свернуть. Насчёт разворчивания, не знаю, надо больше данных. Для наглядности я бы использовал ahkspy и window detective, то что пишет в ини файл, очень странный выбор.

Чем их перебирать? В этом то и суть, что не знаю как отправить команду сворачивание по ClassNN. ahkspy не дает какой то уникальной информации, у всех окон отличается TNewCaption1, и дальше TNewCaption2.. по порядку как они были свернуты.

16

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

У программ на Delphi извращенный подход к окнам.

sim8783 пишет:

пропадает возможность переключения между окнами по клавише Tab

А вы сделайте свое переключение по Tab. Это проще будет.

17 (изменено: sim8783, 2021-03-23 19:27:04)

Re: AHK: Манипуляции с состоянием окна внутри программы по ClassNN

Буду знать).

stealzy пишет:

А вы сделайте свое переключение по Tab. Это проще будет.

Вариант) Благодарю!