1 (изменено: sim8783, 2021-03-23 23:36:34)

Тема: AHK: аналог altTab для окон определенной программы

Необходимо сделать функцию переключения по кнопке Tab в окнах программы FL Studio 20.
Все окна с включенной функцией "Detached", что дает им уникальные ID.
Как я вижу алгоритм:
1. Запрос по WinGet List список всех существующих окон в системе.
2. Отсеить все окна кроме принадлежащих  процессу FL.exe(или PID).
3. Послать команду  открытия в первое окно по ID из списка, кроме активного.

Собственно я со своими мизерными знаниями только на первом пункте...
WinGet List выдает результаты найденых ID отдельно в каждую переменную по порядку var1, var2 и т.д. для каждого. Как эффективно это все сгруппировать в один список, что бы из него можно было отсеить несоответствующие процессу FL.exe?

Как на основе этого списка послать команду активации следующего окна после активного? WinActivate посылает по заголовку, а у меня ID окон, нужно перевести ID окон в их заголовки, только так?

2

Re: AHK: аналог altTab для окон определенной программы

Думаю копать нужно в этом направлении:

App := "FL Studio 20" ; Название окна

F2::
Winget, App_List, List, % App
Loop % App_List
{
 WinGet, Pid, Pid, % "ahk_id " App_List%A_Index%
 MsgBox % App_List%A_Index% " - " Pid
}
Return

3

Re: AHK: аналог altTab для окон определенной программы

__Михаил__ Не подходит. Вы предлагаете выборку по заголовку, но он меняется в зависимости от названия открытого проекта в программе. Было бы ладно, постоянно запрашивать заголовок, но у окон внутри свои заголовки(тоже меняются от содержания), в следствии чего вашь скрипт просто видит лишь саму FL, без окон внутри нее.
Нужна выборка именнопо ahk_exe или ahk_pid, но желательно первое, т.к. пид пеняется,  а FL.exe всегда тот же.

4

Re: AHK: аналог altTab для окон определенной программы

sim8783, а справку почитать самому никак?

5

Re: AHK: аналог altTab для окон определенной программы

Malcevэто разве ремесло просто чтение?! Мне кажется нужно не просто прочитать, а понять действие каждой отдельной функции, все ее ньансы и параметры, ее взаимодействие с другими функциями и исключения каждого такого взаимодействия, взаимодействие этих функций с функциями ОС и ее параметрами, и кучу остального.  Если вы про это мне говорите, то нет, извините, но у меня нет на данный момент лишних пары лет. Для вас может это все и просто выглядит, но не проецируйте пожалуйста свое виденье на других. Если бы все так легко могли освоить всю справу АХК, то и форума этого бы не существовало.

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

6

Re: AHK: аналог altTab для окон определенной программы

https://www.autohotkey.com/docs/misc/WinTitle.htm

7 (изменено: sim8783, 2021-03-25 20:54:07)

Re: AHK: аналог altTab для окон определенной программы

Malcev Благодарю! Я пробовал это дописать к коду Михаила, вместо заголовка, но ввел FL.exe вместо FL64.exe, и из-за неуверенности не стал больше пробовать. Сейчас все заработало. Отдельная благодарность Михаилу за идею с циклом!

В общем дошел до такой задачки:

#SingleInstance force

^TAB::
Winget, App_List, List, ahk_exe FL64.exe

Loop % App_List
{
NextW:= 2 
active:= % App_List%NextW%
WinActivate ahk_id %active% 

KeyWait, TAB, ,T2
sleep 2000
 
 
agen:
 Loop 
 {
 Fw:= A_Index+NextW 
 active2:= % App_List%Fw%
  WinActivate  ahk_id %active2% 
  
KeyWait, TAB, ,T2
 sleep 2000
 goto agen
  
  return
 }

Мне необходимо запускать этот скрипт по клавши таб, одно нажатие - одно переключение окна, но не одних и тех же, а следующего, как в windows. Собственно такая задумка, что скрипт сначала переключает на одно окно, и если в течении 2 секунд небыло повторного переключения, то он останавливается. Если было еще нажатие в этот период - он переходит в следующий цикл с активацией второго по порядку окна из списка App_List, так же ждет 2 секунды, и если было переключение на следующее окно, то скрипт прыгает на начало второй петли и так до конца(что в конце пока не ясно, нужно все заного как то начать, но пока в другом задача). Так вот задача, что когда я нажимаю кнопку таб, то я всегда активирую скрипт сначала, в следствии чего я активирую по очереди только два последних окна, а не все из списка.
Как сделать, что бы горячая клавиша перестала быть "горячей" на время исполнения цикла? Или ваш вариант решения задачи.

P.s: "KeyWait, TAB, ,T2sleep 2000" написано условно, для обозначения места ожидания\перехода.

8

Re: AHK: аналог altTab для окон определенной программы

Malcev
Недавно сам искал аналог altTab (для всех окон). Пробовал такое, и другое, все иногда ошибаются, чему нашёл подтверждение на нескольких форумах, ответа не нашёл, так и остался на Send {LAlt Down}{Tab}{LAlt Up}.
Я не понял как получить Z order который используется в altTab.

В данной задаче (если знать Z order) достаточно активировать следующее окно в Z order принадлежащее процессу, твою ссылку на WinTitle, как на ключ к решению вопроса, я тоже не понял.

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

9 (изменено: Malcev, 2021-03-25 22:04:53)

Re: AHK: аналог altTab для окон определенной программы

serzh82saratov пишет:

Я не понял как получить Z order который используется в altTab.

https://devblogs.microsoft.com/oldnewth … 0/?p=42093
https://devblogs.microsoft.com/oldnewth … 0/?p=24863
Возможно в современном виндовсе надо проверять еще cloak и window band.

serzh82saratov пишет:

твою ссылку на WinTitle, как на ключ к решению вопроса, я тоже не понял.

Я отвечал на вопрос

sim8783 пишет:

Нужна выборка именнопо ahk_exe или ahk_pid, но желательно первое, т.к. пид пеняется,  а FL.exe всегда тот же.

10

Re: AHK: аналог altTab для окон определенной программы

Я таким пользуюсь:

arr := EnumerateAltTabWindows()
for k, v in arr {
   WinGetClass, winClass, ahk_id %v%
   WinGetTitle, title, ahk_id %v%
   altTabWindows .= A_Index . ".`nTitle: " . title . "`nClass: " . winClass . "`nhWnd: " . v . "`n`n"
}
MsgBox, % altTabWindows

EnumerateAltTabWindows() {
   AltTabList := []
   WinGet, list, List
   Loop % list
      if IsAltTabWindow(list%A_Index%)
         AltTabList.Push(list%A_Index%)
   Return AltTabList
}

IsAltTabWindow(hWnd) {
   static GA_ROOTOWNER := 3, WS_EX_APPWINDOW := 0x40000, WS_EX_TOOLWINDOW := 0x80, DWMWA_CLOAKED := 14
   if !DllCall("IsWindowVisible", "Ptr", hWnd)
      Return false
   
   hOwner := DllCall("GetAncestor", "Ptr", hWnd, "UInt", GA_ROOTOWNER, "Ptr")
   hPopup := DllCall("GetLastActivePopup", "Ptr", hOwner, "Ptr")
   if (hOwner = hWnd && hPopup != hWnd)
      Return false
   
   WinGet, exStyles, ExStyle, ahk_id %hWnd%
   if (exStyles & WS_EX_TOOLWINDOW) && !(exStyles & WS_EX_APPWINDOW)
      Return false
   
   DllCall("DwmApi\DwmGetWindowAttribute", "Ptr", hWnd, "UInt", DWMWA_CLOAKED, "UIntP", cloaked, "UInt", 4)
   Return !cloaked
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: аналог altTab для окон определенной программы

В этом коде используется z-order, а не порядок активации окон.

12

Re: AHK: аналог altTab для окон определенной программы

У меня соответствует тому, что я вижу в окне AltTab. За исключением того, что вот сейчас появилось невидимое окно ApplicationManager_ImmersiveShellWindow, которое всегда на первом месте, потом пропало, надо с ним ещё разобраться.

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

13

Re: AHK: аналог altTab для окон определенной программы

Это получается, когда окно Корзины открыто.

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

14

Re: AHK: аналог altTab для окон определенной программы

Наверно, его просто исключить нужно.

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

15

Re: AHK: аналог altTab для окон определенной программы

Ну например у меня не соответсвует если notepad++ поставить always on top - всегда будет первым.
Либо открыть любое окно с более высоким band, например taskmgr.

16

Re: AHK: аналог altTab для окон определенной программы

А есть способ получать окна в порядке активации?

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

17

Re: AHK: аналог altTab для окон определенной программы

Думаю, только если хук ставить и отслеживать.
Но лично мне непонятно зачем вообще использовать аналог alttab вместо alttab.

18

Re: AHK: аналог altTab для окон определенной программы

Предполагаю, что может понадобиться для каких-то целей просто получить список AltTab окон.

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

19

Re: AHK: аналог altTab для окон определенной программы

Ну если нужны только имена, то можно через открытие alttab окна и UI Automation.
Msdn пишет, что можно (было раньше?) через GetAltTabInfo.
Но у меня ее вызвать не получается.

20

Re: AHK: аналог altTab для окон определенной программы

Так это тоже, если только окно AltTab открыто.

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

21

Re: AHK: аналог altTab для окон определенной программы

Ну да. Окно AltTab можно перекрыть снимком экрана.

22

Re: AHK: аналог altTab для окон определенной программы

Наверно, но к таким костылям стоит прибегать лишь в крайнем случае, проще мой код выше дополнить исключением определённых окон.

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

23

Re: AHK: аналог altTab для окон определенной программы

Так в твоем коде окна не по порядку идут.

24

Re: AHK: аналог altTab для окон определенной программы

Ну так порядок как раз не особо важен, если не делаешь «аналог AltTab».

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

25

Re: AHK: аналог altTab для окон определенной программы

А есть у вас соображения по поводу моего вопроса http://forum.script-coding.com/viewtopic.php?pid=146919#p146919 с горячей клавишей и ее блокировкой на время выполнения лупа?

26

Re: AHK: аналог altTab для окон определенной программы

https://www.autohotkey.com/docs/commands/Hotkey.htm

27

Re: AHK: аналог altTab для окон определенной программы

MalcevЗабавно, вроде самая говорящая за название AutoHotKey функция, а раньше не прегождалась) Благодарю!

Вообщем все теперь работает как нужно, изначально думал GUI со скриншетами сделать, как в windows, но почти сразу отказался от этой затеи, да и стандартное переключение в FL по Tab для не "Detach"нных окон работает без предпросмотра.
Работает скрипт как и стандартный переключаетель FL. Если листать с интервалом меньше секунды, то листает по поряду, а если нажать через секунду после предыдущего раза, то откроет предидущее окно, как и в windows. Если вдруг кому пригодится вот код, можно адоптировать под любую программу или как альтернативу встроенному в windows:

TAB::
start:
Winget, App_List, List, ahk_exe FL64.exe,,,ahk_class TFruityLoopsMainForm

Loop % App_List
{
NextW:= 2 
active:= % App_List%NextW%
WinActivate ahk_id %active% 
Sleep 50
Hotkey, TAB,, Off
KeyWait, TAB, D, T1

if errorlevel
            {
Hotkey, TAB,, On
return
             }
  else
  {
agen:
 Loop 
    {
 Fw:= A_Index+NextW 

 if ( Fw < App_List )

                 {

 active2:= % App_List%Fw%
 WinActivate  ahk_id %active2% 
 Sleep 50
 KeyWait, TAB, D, T1

if errorlevel
        {
Hotkey, TAB,, On
return
        }
                 }
                       else
                       {
                       Hotkey, TAB,, On
                       goto start
                       return
                       }
    } ;loop2
  }

} ;loop1
 
return