1

Тема: AHK: Ожидание нескольких окон

Господа, нужно чтоб выполнялся скрипт, и при этом ожидал несколько окон. Ничего кроме такого варианта в голову не приходит

SetTimer, WinActive, 200
 
WinActive:   
WinGetTitle, Title, A
List := {"Безымянный — Блокнот": "Блокнот", "Program Manager": "Раб. стол"}
if List.HasKey(Title) 
MsgBox % List[Title]
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2 (изменено: Irbis, 2012-08-31 22:41:39)

Re: AHK: Ожидание нескольких окон

Скрипт, ожидающий окна из списка:

List := {"Безымянный — Блокнот": "Блокнот", "Program Manager": "Раб. стол"}
for key in List
   GroupAdd, MyGroup, %key%
WinWaitActive, ahk_group MyGroup
WinGetTitle, t, A
MsgBox % t

3

Re: AHK: Ожидание нескольких окон

нужно чтоб выполнялся скрипт, и при этом ожидал несколько окон

Так не работает, и на выходе нужно не "Безымянный — Блокнот" а "Блокнот".

Gui, +AlwaysOnTop -Border +ToolWindow
Gui, Color, Blue
Gui, font, s22
Gui, Add, Text, cWhite, Ждём Блокнот
Gui, Show, NoActivate x5 y5, §©?«®µ¶
Return

List := {"Безымянный — Блокнот": "Блокнот", "Program Manager": "Раб. стол"}
for key in List
GroupAdd, MyGroup, %key%
WinWaitActive, ahk_group MyGroup
WinGetTitle, t, A
MsgBox % t
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4 (изменено: creature.ws, 2012-09-01 13:42:36)

Re: AHK: Ожидание нескольких окон

Так — работает, не работает — так, как пример пытаетесь использовать вы.

List := {"Безымянный — Блокнот": "Блокнот", "Program Manager": "Раб. стол"}
for key in List
    GroupAdd, MyGroup, %key%

Gui, +AlwaysOnTop -Border +ToolWindow
Gui, Color, Blue
Gui, font, s22
Gui, Add, Text, cWhite, Ждём Блокнот
Gui, Show, NoActivate x5 y5, §©?«®µ¶

WinWaitActive, ahk_group MyGroup
WinGetTitle, t, A
MsgBox % List[t]
Return

А вообще, о чем речь то? Чем вас не устраивает собственный вариант из сообщения #1?

5

Re: AHK: Ожидание нескольких окон

Понял. Спасибо за помощь.

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

6 (изменено: serzh82saratov, 2012-12-06 01:32:09)

Re: AHK: Ожидание нескольких окон

Господа, есть скрипт в котором при запуске стартует цикл ожидания окон.
При работе скрипта хоткеями могут быть запущены ещё несколько потоков на ожидание с разными интервалами ожидания:


запуск функции на ожидание
действие 1
действие 2

Почитал эту тему http://forum.script-coding.com/viewtopic.php?id=6739 не понял, даже того относится ли оно как-то к сабжу.

Так понимаю что единственный выход это создавать файлы скриптов, и запускать их отдельным процессом с помощью RunWait чтоб далее выполнялись действие 1 и действие 2 по окончанию ожидания.

Есть какие-то другие варианты?
И каковы могут быть недостатки предложенного?

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

7

Re: AHK: Ожидание нескольких окон

Что то я неподумал о том что RunWait тоже поток на ожидание

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

8

Re: AHK: Ожидание нескольких окон

#Include OnWindow.ahk

; при запуске скрипта начинаем ждать факт создания окна проводника
OnWindowCreated("ahk_class CabinetWClass", "WaitForExplorerWindowCreated")
; при запуске скрипта начинаем ждать факт активации окна проводника
OnWindowActivated("ahk_class CabinetWClass", "WaitForExplorerWindowActivated")

; при нажатии F2 переключаем ожидание активации окна проводника
F2::OnWindowActivated("ahk_class CabinetWClass",  OnWindowActivated("ahk_class CabinetWClass")? "":"WaitForExplorerWindowActivated")

WaitForExplorerWindowCreated(hWnd) {
    MsgBox,, %A_ThisFunc%:`n hWnd = %hWnd%, Действие 1
}

WaitForExplorerWindowActivated(hWnd) {
    MsgBox,, %A_ThisFunc%:`n hWnd = %hWnd%, Действие 2
}

Содержимое файла OnWindow.ahk:


OnWindowCreated(winTitle, procName = -1, maxThreads = 1) {
    return ManageShellHookEventListeners("HSHELL_WINDOWCREATED", winTitle, procName, maxThreads)
}

OnWindowActivated(winTitle, procName = -1, maxThreads = 1) {
    return ManageShellHookEventListeners("HSHELL_WINDOWACTIVATED", winTitle, procName, maxThreads)
}

ManageShellHookEventListeners(hookCode, ByRef winTitle, ByRef procName, ByRef maxThreads) {
    static ShellHookEventList
    static HookCodeList := {HSHELL_WINDOWCREATED: 1, HSHELL_WINDOWACTIVATED: 4}

    if !hookCode := HookCodeList[hookCode]
        return false

    IsObject(ShellHookEventList) || ShellHookEventList := ShellProc(-1, 0) ; здесь копируем ссылку
    IsObject(ShellHookEventList[hookCode]) || ShellHookEventList[hookCode] := Object()

    if (procName = -1)
        return ShellHookEventList[hookCode][winTitle].Name

    else if (procName = "")
        return ShellHookEventList[hookCode].Remove(winTitle).Name

    else if IsFunc(procName) {
        shellhookWM := DllCall("RegisterWindowMessage", "Str", "SHELLHOOK", "UInt")

        if !OnMessage(shellhookWM) {
            DllCall("RegisterShellHookWindow", "Ptr", A_ScriptHwnd, "Int")
            OnMessage(shellhookWM, "ShellProc", maxThreads)
        }

        if !priorProcName := ShellHookEventList[hookCode].Remove(winTitle).Name
            priorProcName := procName

        ShellHookEventList[hookCode][winTitle] := Func(procName)
        return priorProcName
    }

    else return false
}

ShellProc(wParam, lParam) {
    static ShellHookEventList := {} ; здесь инициализируем

    if ShellHookEventList.HasKey(wParam) {
        for winTitle, Proc in ShellHookEventList[wParam]
            if WinExist(winTitle . " ahk_id" . lParam)
                %Proc%(lParam)
    }
    else if (wParam = -1)
        return ShellHookEventList
    else Sleep 0
}

9 (изменено: serzh82saratov, 2012-12-06 13:02:56)

Re: AHK: Ожидание нескольких окон

Спасибо. Хороший код, настоящая многопоточность.
Но у меня к сожалению потребность заключается в том чтоб следующая строка после вызова функции выполнялась после окончания ожидания, типа:

OnWindowActivated("ahk_class CabinetWClass", "WaitForExplorerWindowActivated")
MsgBox Теперь активно 

Эквивалентно

WinWaitActive ahk_class CabinetWClass
MsgBox Теперь активно

#6
с помощью RunWait чтоб далее выполнялись действие 1 и действие 2 по окончанию ожидания.

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

10 (изменено: creature.ws, 2012-12-06 14:04:34)

Re: AHK: Ожидание нескольких окон

Не эквивалентно.

чтоб следующая строка […] выполнялась после окончания ожидания,

OnWindowActivated("ahk_class CabinetWClass", "WaitForExplorerWindowActivated")
return

WaitForExplorerWindowActivated(hwnd) {
    OnWindowActivated("ahk_class CabinetWClass", "")
    MsgBox окно проводника было активно, это событие более не будет обрабатываться
}

11

Re: AHK: Ожидание нескольких окон

Поток сознания.


OnWindowActivated(("ahk_class CabinetWClass", "") отключает дальнейшее ожидание, это понятно.

Но как реализовать это:


Space::
OnWindowActivated("ahk_class CabinetWClass", "WaitForExplorerWindowActivated")
MsgBox Теперь активно 
return

непонятно.

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

12 (изменено: creature.ws, 2012-12-06 14:43:49)

Re: AHK: Ожидание нескольких окон

Space::OnWindowActivated("ahk_class CabinetWClass", "WaitForExplorerWindowActivated")

WaitForExplorerWindowActivated(hwnd) {
    MsgBox Теперь активно 
}

Замечательный диалог.

13 (изменено: serzh82saratov, 2012-12-06 15:03:13)

Re: AHK: Ожидание нескольких окон

Это понятно.

Необходим именно приведённый мною синтаксис.
Ибо другой скрипт в зависимости от действий юзверя, создаёт файл ввиде скрипта, вот кусок:

***
#IF Config = "2 режим"
vk31:: ;§startkey¶1 кнопка§2 режим§
WinWait("ahk_class OperaWindowClass", "§¶Delimiter1§¶", "5§1§") ;¤¤1¤¤¶¶2 режим¶¶1 кнопка¶¶Ждать окно¶¶
 MsgBox Теперь активно ;¤¤2¤¤¶¶2 режим¶¶1 кнопка¶¶Скрипт AutoHotkey¶¶
Return ;§2 режим§endkey¶1 кнопка§
#IF ;end§2 режим§Config
***

И функция:

WinWait(WinWait, Delimiter1, Seconds)
{
StringTrimRight, Sec, Seconds, 3
if Sec = 0
Sec =
ifinString, Seconds, §1§
WinWait %WinWait%, , %Sec%
ifinString, Seconds, §2§
WinWaitActive %WinWait%, , %Sec%
ifinString, Seconds, §3§
WinWaitNotActive %WinWait%, , %Sec%
ifinString, Seconds, §4§
WinWaitClose %WinWait%, , %Sec%
}

Тут MsgBox выполняется после ожидания. Естественно что если юзер запустит несколько разных потоков ожидания, то будет выполнятся только последний из них.
А хочется чтоб все.

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

14 (изменено: creature.ws, 2012-12-06 15:37:25)

Re: AHK: Ожидание нескольких окон

Не подскажу, увы.
Кажется, проблема в:

Необходим именно приведённый мною синтаксис.

15

Re: AHK: Ожидание нескольких окон

А если после строки WinWait() возможно поместить ещё "пару" своих строк перед MsgBox?

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

16 (изменено: serzh82saratov, 2012-12-07 02:36:22)

Re: AHK: Ожидание нескольких окон

Вроде нашёл решение после OnWindowActivated пропишу Return, а подним метку к которой переходить из WaitForExplorerWindowActivated

OnWindowActivated("ahk_class CabinetWClass", "WaitForExplorerWindowActivated", "имя_метки", "секунды")
return
метка:
MsgBox Теперь активно
return

WaitForExplorerWindowActivated(hwnd, имя_метки) {
    Goto, %имя_метки%
}

Интересно, если в один момент произойдёт окончание ожидания нескольких окон, то будет ли осуществлён переход по всем меткам?

И возможно-ли переделать Ваш код под ожидание - Существования, Активности, Неактивности, Закрытия окон с указанием времени ожидания, и передачей имени метки?

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