1

Тема: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Всем превед.

Скрипт должен по горячей клавише открывать СВОЁ окно, если оно НЕ существует.
Скрипт должен по горячей клавише активировать СВОЁ окно, если оно существует.

Все папки находятся по пути: D:\GoogleDrive

D:\GoogleDrive\F1
D:\GoogleDrive\F2
D:\GoogleDrive\F2

D:\GoogleDrive\F1\F1
D:\GoogleDrive\F2\F2
D:\GoogleDrive\F3\F3

Соответственно различается только "Title", параметры "ahk_class", "ahk_exe" и "ahk_pid" одинаковые для всех этих окон.

ahk_class CabinetWClass
ahk_exe Explorer.EXE
ahk_pid 7364

пишу такой скрипт:

!sc010::
if WinExist("D:\GoogleDrive")
    WinActivate 
else
    Run, D:\GoogleDrive
Return

!sc002::
 if WinExist("D:\GoogleDrive\1")
    WinActivate
   else
 Run, D:\GoogleDrive\1                                                          
Return

!sc003::
 if WinExist("D:\GoogleDrive\2")
    WinActivate
   else
 Run, D:\GoogleDrive\2                                                            
Return

!sc004::
 if WinExist("D:\GoogleDrive\3")
    WinActivate
   else
 Run, D:\GoogleDrive\3                                                            
Return

!sc005::
 if WinExist("D:\GoogleDrive\1\1")
    WinActivate
   else
 Run, D:\GoogleDrive\1\1                           
Return

!sc006::
 if WinExist("D:\GoogleDrive\2\2")
    WinActivate
   else
 Run, D:\GoogleDrive\2\2
Return

!sc007::
 if WinExist("D:\GoogleDrive\3\3")
    WinActivate
   else
 Run, D:\GoogleDrive\3\3
Return

При любом активном окне 1, 2, 3 или 1\1, 2\2, 3\3 не активируется и не запускается D:\GoogleDrive

Горячие клавиши запускают/переключают не свои окна.

Понимаю, что проблемы из-за того, что Title совпадает.

Подскажите, как решить, если задача сложна, в личку, решим на коммерческой основе)

2

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

По-хорошему - сократить бы код, много одинаковых действий.

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

3

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Наверное надо как-то пробовать работать с ExcludeTitle, ExcludeText.

Но слишком много исключать придётся)

4

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Каждое действие это своя горячая клавиша, их всего 7 шт.

5

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

timinlight

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

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

6

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Так же не могу понять в чём проблема, 'WinExist' не может определить окна?

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

7

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Ок.

вот так:

!sc010::                                              ; Alt+Q активирует/запускает окно "D:\GoogleDrive"         Title: "D:\GoogleDrive"
if WinExist("D:\GoogleDrive")
    WinActivate 
else
    Run, D:\GoogleDrive
Return

!sc002::                                              ; Alt+1 активирует/запускает окно "D:\GoogleDrive\1"       Title: "D:\GoogleDrive\1"
 if WinExist("D:\GoogleDrive\1")
    WinActivate
   else
 Run, D:\GoogleDrive\1                                                          
Return

!sc003::                                              ; Alt+2 активирует/запускает окно "D:\GoogleDrive\1\1"     Title: "D:\GoogleDrive\1\1"
 if WinExist("D:\GoogleDrive\1\1")
    WinActivate
   else
 Run, D:\GoogleDrive\1\1                           
Return

три горячих клавиши, три скрипта, три окна.

по горячей клавише окно должно либо восстановиться, если существует, либо запуститься, если не существует.

Попробуйте этот скрипт у себя, увидите проблему.

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

8

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

timinlight

Что должно запускаться 'D:\GoogleDrive\1\1' - расширения нет.

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

9

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

это папки. скрипт открывает окна папок. расширений и не должно быть)

10 (изменено: __Михаил__, 2020-12-10 19:28:38)

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

timinlight

Проверил так - пашет.

SetTitleMatchMode, 3

Path = C:\

!Q::	; Alt+Q/1/2	активирует/запускает окно.
!1::
!2::
If (A_ThisHotkey = "!Q")
{
 If WinExist(Path)
	WinActivate 
 Else
	Run, % Path
}
Else If (A_ThisHotkey = "!1")
{
 If WinExist(Path "\Games")
	WinActivate 
 Else
	Run, % Path "\Games"
}
Else
 ToolTip, Нет действий: %A_ThisHotkey%
Return
Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

11

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Если сократить:

SetTitleMatchMode, 3

Path = D:\GoogleDrive

!Q::	;	Alt + Q / 1 / 2  Активирует / Запускает окно "D:\GoogleDrive" + "\1" / "\1\1"
!1::
!2::
PathKey := (A_ThisHotkey = "!1" ? "\1" : A_ThisHotkey = "!2" ? "\1\1" : "")

If WinExist(Path PathKey)
	WinActivate 
 Else
	Run, % Path PathKey
Return
Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

12

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

если несложно, пожалуйста с моими папками попробуйте, создав их у себя на диске D:

именно так, как  у меня:

D:\GoogleDrive
D:\GoogleDrive\1
D:\GoogleDrive\1\1

13

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

timinlight

Код выше не работает? Я специально адаптировал для тебя. Проверь его.

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

14

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

не работает

15 (изменено: __Михаил__, 2020-12-10 20:28:08)

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

А должен. Что-то было изменено значит. У меня прекрасно работает сокращённый код из 11 сообщения.

Версия программы какая установлена?

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

16

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Скорее всего нужно Google Drive вместо GoogleDrive, если речь идёт о папке Гугл диска.

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

17

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Версия 1.1.33.02 unicode 64 bit,  последняя т.е.

папка Гугл Диска у меня расположена на диске D. 

D:\GoogleDrive

18

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

и ещё две папки, одна в одной:

D:\GoogleDrive\1
D:\GoogleDrive\1\1

19

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Run D:\GoogleDrive

Такой код открывает папку?

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

20

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Да, октрывает.

Посмотрите седьмое сообщение, там внизу я всё описал:

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

http://forum.script-coding.com/viewtopic.php?pid=144072#p144072

21

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Запустите мой скрипт у себя, создайте такие же папки и всё увидите.

22

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

timinlight пишет:
D:\GoogleDrive\F1
D:\GoogleDrive\F2
D:\GoogleDrive\F2

D:\GoogleDrive\F1\F1
D:\GoogleDrive\F2\F2
D:\GoogleDrive\F3\F3

А в первом сообщении в скрипте написано

D:\GoogleDrive\1
...
D:\GoogleDrive\2
...
D:\GoogleDrive\1\1
D:\GoogleDrive\2\2
D:\GoogleDrive\3\3

Так как всё-таки должны называться папки?

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

23

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

для простоты пока пусть будут такие:

D:\GoogleDrive
D:\GoogleDrive\1
D:\GoogleDrive\1\1


скрипт для них я считаю правильный, надо только чтобы они активировались нормально.


!sc010::                                              ; Alt+Q активирует/запускает окно "D:\GoogleDrive"         Title: "D:\GoogleDrive"
if WinExist("D:\GoogleDrive")
    WinActivate 
else
    Run, D:\GoogleDrive
Return

!sc002::                                              ; Alt+1 активирует/запускает окно "D:\GoogleDrive\1"       Title: "D:\GoogleDrive\1"
 if WinExist("D:\GoogleDrive\1")
    WinActivate
   else
 Run, D:\GoogleDrive\1                                                          
Return

!sc003::                                              ; Alt+2 активирует/запускает окно "D:\GoogleDrive\1\1"     Title: "D:\GoogleDrive\1\1"
 if WinExist("D:\GoogleDrive\1\1")
    WinActivate
   else
 Run, D:\GoogleDrive\1\1                           
Return

24

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

timinlight, прочитайте про SetTitleMatchMode. По умолчанию стоит нестрогий поиск, совпадение по началу заголовка. Вам нужен режим 3.
И убедитесь, что заголовок определен правильно с помощью Window Spy (Пуск → AutoHotkey → ).

25

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

По-моему тут уже ничего не поможет - TC просто игнорит код из 11 сообщения, который должен срабатывать. Разве нет? Видео записать, анимацию?

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

26 (изменено: teadrinker, 2020-12-11 16:29:19)

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

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

который должен срабатывать. Разве нет?

Не обязательно. Не знаю, как у вас, но у меня в заголовке окна проводника на Windows 10 только имя папки, а не полный путь.
Можно так:

Folders := {Q: "D:\GoogleDrive", 1: "D:\GoogleDrive\1", 2: "D:\GoogleDrive\1\1"}

!Q::
!1::
!2::
   folderPath := Folders[ SubStr(A_ThisHotkey, 2) ]
   if WinExist( "ahk_id" . GetFolderHwnd(folderPath) )
      WinActivate
   else
      Run, % folderPath
   Return

GetFolderHwnd(FolderPath)
{
   for item in ComObjCreate("Shell.Application").Windows
      if (item.Document.Folder.Self.Path = FolderPath)
         Return item.hwnd
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

27

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

teadrinker

У меня полный путь к папке указывается.

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

28

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Ну, скрипт же не только у вас должен работать.

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

29 (изменено: __Михаил__, 2020-12-11 21:28:09)

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

timinlight

Как заставить Проводник Windows 10 показывать полный путь к папкам в строке заголовка.

teadrinker

Я в настройки даже не лез, думаю это сборка винды такая по умолчанию.

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

30 (изменено: timinlight, 2020-12-12 07:59:38)

Re: AHK: Активация/Запуск окна по WinExist/WinActivate по Title

Заработали оба скрипта.


из поста 11 http://forum.script-coding.com/viewtopi … 78#p144078

и из поста 26 http://forum.script-coding.com/viewtopi … 05#p144105


я их вставлял в тело своего старого ahk, там много всего, в том числе в начале было включение и фиксация NumLock:

SetNumLockState, ON       ; Set NumLock ON
NumLock::Return           ; Lock NumLock Key

если убрать эти две строки(фиксацию NumLock), скрипты __Михаил__ и teadrinker работают.


также попробовал убрать галку с пункта: Выводить полный путь в заголовке окна и сразу заработал мой скрипт, ибо "Title" стал уникальным для каждого окна.

либо, как сказал stealzy использовать SetTitleMatchMode режиме 3.

Век живи - век учись, спасибо всем!)