1 (изменено: Malcev, 2013-05-23 05:30:22)

Тема: AHK: Замена WinWaitClose или IfWinNotExist

Есть аудиоредактор audacity в котором скриптом вызывается окно и накладывается аудиофильтр, после чего ожидается, когда окно закроется с помощью WinWaitClose и вызываетется окно другого фильтра.
Проблема в следующем - если аудиофайл большой, некомпрессированный, то процесс ожидания затягивается на 5 минут, после чего программа виснет (если применять WinWaitClose или IfWinNotExist)
Sleep расставлял - не помогает.
Какие варианты помогут обойти эту проблему?
Сам скрипт

WinActivate, ahk_class wxWindowClassNR
WinWaitActive, ahk_class wxWindowClassNR
WinMenuSelectItem, , , Effect, Compressor...
WinWait, Dynamic Range Compressor ahk_class #32770
SendInput, {Enter}
WinWait, Compressor... ahk_class #32770, , 0.6
sleep, 200
WinWaitClose, Compressor... ahk_class #32770

; Процесс наложения фильтра доходит до 100 % и программа виснет

WinActivate, ahk_class wxWindowClassNR
WinWaitActive, ahk_class wxWindowClassNR
WinMenuSelectItem, , , Effect, Fast Lookahead limiter...
WinWait, Fast Lookahead limiter ahk_class #32770
SendInput, 15
ControlSetText, Edit2, -2
ControlSetText, Edit3, 1
SendInput, {Enter}
return

2

Re: AHK: Замена WinWaitClose или IfWinNotExist

; Процесс наложения фильтра доходит до 100 % и программа виснет

Какая программа виснет, скрипт или аудиоредактор?

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

3

Re: AHK: Замена WinWaitClose или IfWinNotExist

Аудиоредактор.

4

Re: AHK: Замена WinWaitClose или IfWinNotExist

То есть вы хотите сказать, что виснет он только из-за использования скрипта?

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

5

Re: AHK: Замена WinWaitClose или IfWinNotExist

Да. И такое же у меня случалось с другой программой с этими же командами.
Возможно такое из-за большой нагрузки на поцессор?

6 (изменено: serzh82saratov, 2013-05-23 14:58:33)

Re: AHK: Замена WinWaitClose или IfWinNotExist

Не знаю что за глюк. У меня WinWaitClose иногда сутками запущена, и никогда проблем небыло.
Ожидайте тогда сообщение от "SHELLHOOK".
Но связь AutoHotkey и программы я невижу.

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

7

Re: AHK: Замена WinWaitClose или IfWinNotExist

Ожидайте тогда сообщение от "SHELLHOOK".

Это как?

8 (изменено: creature.ws, 2013-05-23 16:00:12)

Re: AHK: Замена WinWaitClose или IfWinNotExist

Это как?

Так или так

9 (изменено: serzh82saratov, 2013-05-23 16:00:21)

Re: AHK: Замена WinWaitClose или IfWinNotExist


DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc")
 
TargetWinId := WinExist("Compressor... ahk_class #32770")
 ; TargetWinId := WinExist("Безымянный — Блокнот ahk_class Notepad") 

ShellProc(nCode, wParam)    {
    Global TargetWinId
    If (nCode = 2)
    {    
        If (wParam = TargetWinId)
            MsgBox Close TargetWinId
    }  
} 
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

10

Re: AHK: Замена WinWaitClose или IfWinNotExist

nCode ЭТО:

http://msdn.microsoft.com/en-us/library … s.85).aspx

HSHELL_ACCESSIBILITYSTATE := 11     
HSHELL_ACTIVATESHELLWINDOW := 3     
HSHELL_APPCOMMAND := 12     
HSHELL_GETMINRECT := 5     
HSHELL_LANGUAGE := 8     
HSHELL_REDRAW := 6     
HSHELL_TASKMAN := 7     
HSHELL_WINDOWACTIVATED := 4     
HSHELL_WINDOWCREATED := 1     
HSHELL_WINDOWDESTROYED := 2     
HSHELL_WINDOWREPLACED := 13

то есть 2 это HSHELL_WINDOWDESTROYED 

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

11 (изменено: Malcev, 2013-05-23 18:33:25)

Re: AHK: Замена WinWaitClose или IfWinNotExist

Не работает ваш код - не выводит сообщение.
Хотя название окна:

>>>>>>>>>>( Window Title & Class )<<<<<<<<<<<
Compressor...
ahk_class #32770

12

Re: AHK: Замена WinWaitClose или IfWinNotExist

Не работает ваш код

Аргументированное утверждение.
Лично во мне пребывает стойкая уверенность того, что вы совершенно не понимаете как этот код должен работать, и соответственно неможете его использовать.
Но так как вопрос в стиле - "я не понимаю, будьте добры, подскажите как" попахивает как-то не самоутвердительно. То во имя добра но не здравого смысла, скажу, что "да", неработает.

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

13

Re: AHK: Замена WinWaitClose или IfWinNotExist

Вы не поняли.
С блокнотом-то ваш код работает, а вот с Compressor... ahk_class #32770 - нет.

14 (изменено: serzh82saratov, 2013-05-23 23:06:40)

Re: AHK: Замена WinWaitClose или IfWinNotExist

Угу и я про то же:

serzh82saratov пишет:

Аргументированное утверждение.

Значит надо сразу говорить что с блокнотом норм, и приводить код как вы его используете и не работает.
Вы шпион, или с вас деньги за лишние нажатия на клавиатуру берут?

Вы не поняли.

Конечно непонял, как тут что поймешь. Угадай мелодию с двух нот.

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

15

Re: AHK: Замена WinWaitClose или IfWinNotExist

Я запускал ваш код, который по аналогии с блокнотом при закрытии окна Compressor... ahk_class #3277 показывает сообщение.

DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc")
 
TargetWinId := WinExist("Compressor... ahk_class #32770")
 ; TargetWinId := WinExist("Безымянный — Блокнот ahk_class Notepad") 

ShellProc(nCode, wParam)    {
    Global TargetWinId
    If (nCode = 2)
    {    
        If (wParam = TargetWinId)
            MsgBox Close TargetWinId
    }  
} 
Return

Но в отличие от блокнота при закрытии Compressor... ahk_class #32770 он мессадж не выдает.

16

Re: AHK: Замена WinWaitClose или IfWinNotExist

Вы хотя бы отладку какую-то делали?:


DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc")

ToolTip % "Id = " TargetWinId := WinExist("Compressor... ahk_class #32770")

ShellProc(nCode, wParam)    {
    Global TargetWinId
    If (nCode = 2)
    {    
        If (wParam = TargetWinId)
            MsgBox Close TargetWinId
    }  
} 
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

17

Re: AHK: Замена WinWaitClose или IfWinNotExist

Не, не делал.
Показывает: Id = 0x43188a

18

Re: AHK: Замена WinWaitClose или IfWinNotExist

После того как получили Id проверьте нужное окно другим инструментом и сравните их Id.

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

19 (изменено: Malcev, 2013-05-23 23:43:54)

Re: AHK: Замена WinWaitClose или IfWinNotExist

Winget показывает такой же результат.
Кстати хук от уважаемого teadrinker работает.
Только надо его как-то изменить под мои нужды.
http://forum.script-coding.com/viewtopi … 431#p65431

EVENT_OBJECT_FOCUS := 0x8005

SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, 0, RegisterCallback("HookProc", "F"), 0, 0, 0)

Loop
{
   ToolTip % A_Index
   Sleep, 300
}
   
   
HookProc(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
{
   WinGetClass, class, A
   if (class = "Notepad")
      ExitApp
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
   return DllCall("SetWinEventHook" , UInt, eventMin
                                    , UInt, eventMax
                                    , Ptr, hmodWinEventProc
                                    , Ptr, lpfnWinEventProc
                                    , UInt, idProcess
                                    , UInt, idThread
                                    , UInt, dwFlags)
}

20

Re: AHK: Замена WinWaitClose или IfWinNotExist

А можно продолжить отладку и смотреть какое окно убивается:


DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc")

ToolTip % "Id = " TargetWinId := WinExist("Compressor... ahk_class #32770")

ShellProc(nCode, wParam)    {
    Global TargetWinId
    If (nCode = 2) 
        ToolTip % wParam "  =?  " TargetWinId 
} 
Return

и сделать вывод что WinExist в вашем случае определяет Id не того окна.
Пробовать сначала активировать окно, и получать Id как WinExist("A").
Если нет, то получить Id всех окон "Compressor... ahk_class #32770" и копать дальше.

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

21 (изменено: Malcev, 2013-05-24 00:08:58)

Re: AHK: Замена WinWaitClose или IfWinNotExist

Не понимаю.
Скрипт зависает на
If (nCode = 2)

22

Re: AHK: Замена WinWaitClose или IfWinNotExist

Что значит зависает на  If (nCode = 2). Как это определено?

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

23

Re: AHK: Замена WinWaitClose или IfWinNotExist

В смысле дальше node = 2 не идет.
То есть эта функция не отлавливает закрытие этого окна.

24

Re: AHK: Замена WinWaitClose или IfWinNotExist

А блокнот

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

25

Re: AHK: Замена WinWaitClose или IfWinNotExist

А закрытие блокнота отлавливает.
Может окно у audacity специфическое.

26

Re: AHK: Замена WinWaitClose или IfWinNotExist

Я правильно понял что при закрытии окна Compressor... ahk_class #32770 ToolTip не появляется.

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

27

Re: AHK: Замена WinWaitClose или IfWinNotExist

Да, не появляется.

28 (изменено: serzh82saratov, 2013-05-24 01:28:10)

Re: AHK: Замена WinWaitClose или IfWinNotExist

Не принял я во внимание что окно ваше дочернее, ShellProc их не все распознаёт.
По счёт этого тоже не уверен:



EVENT_OBJECT_DESTROY := 0x8001

SetWinEventHook(EVENT_OBJECT_DESTROY, EVENT_OBJECT_DESTROY, 0, RegisterCallback("HookProc", "F"), 0, 0, 0)

TargetWinId := WinExist("Безымянный — Блокнот ahk_class Notepad")  

   
HookProc(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
{  
    Global TargetWinId
    If (hwnd = TargetWinId)
        ToolTip % hwnd "   =    " TargetWinId
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
   return DllCall("SetWinEventHook" , UInt, eventMin
                                    , UInt, eventMax
                                    , Ptr, hmodWinEventProc
                                    , Ptr, lpfnWinEventProc
                                    , UInt, idProcess
                                    , UInt, idThread
                                    , UInt, dwFlags)
}
return

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

29

Re: AHK: Замена WinWaitClose или IfWinNotExist

Да, так работает.
Спасибо!
А откуда вы взяли этот параметр - EVENT_OBJECT_DESTROY := 0x8001

30

Re: AHK: Замена WinWaitClose или IfWinNotExist

Event Constants

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