View previous topic :: View next topic |
Author |
Message |
Avada
Joined: 01 Aug 2008 Posts: 10276 Location: Россия, Саратов
|
(Separately) Posted: Wed Mar 06, 2019 18:25 Post subject: |
|
|
Flasher
Попробовал последний вариант. Кнопка (скрипт с параметром) работает нормально. Но точно такая же юзер-команда вызывает размножение окон TC. В чём может быть дело? Пока использую предыдущую версию, там у меня вроде как всё OK. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Wed Mar 06, 2019 19:26 Post subject: |
|
|
Avada
Так происходит при вызове с хоткея (Какого?) или и с кнопки с юзеркомандой тоже?
Под размножением окон ты подразумеваешь зацикливание создания экземпляров?
На чистом ТС без плагинов подобное наблюдается? _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Avada
Joined: 01 Aug 2008 Posts: 10276 Location: Россия, Саратов
|
(Separately) Posted: Wed Mar 06, 2019 21:10 Post subject: |
|
|
Flasher
И с кнопки с юзер-командой, и при её запуске из командной строки TC, и хотееем для неё, без разницы. А с экземплярами там не зацикливание, а именно приращение. Допустим, у меня единственный 32-битный экземпляр без номера в заголовке. Выполняется команда. Открывается второе окно для 64-битного TC с (2) в заголовке. Выполняем в нём команду. 32-битная версия теперь открывается в третьем окне при сохранении прежних окон... и так далее. На чистом TC (только с юзер-командами) — та же история. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Mar 07, 2019 02:05 Post subject: |
|
|
Avada
Т.е. ты просто хочешь сказать, что исходный экземпляр не закрывается? С учётом ProcessWaitClose(WinGetProcess($hWnd)) это довольно странная история, т.к. до открытия нового скрипт должен ждать бесконечно долго, пока не завершится процесс ТС. И только лишь с добавкой двух завершающих в условии элементов активации окна в этой части измениться ничего точно не могло. Либо ты слукавил насчёт последней редакции (дописка была и в предыдущем варианте без шапки).
И речь сейчас идёт только про скомпилированный случай? Или с актуальным AutoIt3.exe та же история? Компилятор Aut2exe.exe тоже актуальный? _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Avada
Joined: 01 Aug 2008 Posts: 10276 Location: Россия, Саратов
|
(Separately) Posted: Thu Mar 07, 2019 08:31 Post subject: |
|
|
Flasher
Да, исходный экземпляр не закрывался. Но там, как выяснилось, результаты менялись несколько раз по непонятным причинам. Поэтому сегодня всё протестировал заново на той машине, где AutoIt3.exe и Aut2exe.exe использованы заведомо актуальные. Всё работает отовсюду, в том числе и в варианте c EXE. Видимо, на этом проблему можно считать закрытой. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Mar 07, 2019 12:55 Post subject: |
|
|
Avada
Ну, и отлично. Так и думал, что дело в версии.
Сделал активацию ещё более стабильной. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Thu Mar 07, 2019 18:46 Post subject: |
|
|
http://forum.wincmd.ru/viewpost.php?p=129148
Code: | Opt("WinWaitDelay", 0) |
Бессмысленное число, только процессор тр... теребить, 100 с головой хватит.
Code: | WinWaitActive("[CLASS:TTOTAL_CMD]")
$WSS = ObjCreate('WScript.Shell')
$WSS.AppActivate($PID) |
???
И проще $PID проверить, прежде чем снова теребить, окно не появится быстрее, если искать его в несколько раз чаще.
WinWaitActive() чаще используют если что-то запустили и теперь ждут евонное окно.
Code: | #NoTrayIcon
Opt("WinWaitDelay", 100)
Local $hWnd = WinGetHandle("[CLASS:TTOTAL_CMD]")
If $hWnd Then
Local $TC = $CmdLine[1], $PFix = '', $n = 4
WinClose($hWnd)
ProcessWaitClose(WinGetProcess($hWnd))
If @OSArch <> 'x86' Then
If StringRight($TC, 6) = '64.EXE' Then
$n = 6
Else
$PFix = '64'
EndIf
EndIf
Local $PID = Run(StringLeft($TC, StringLen($TC) - $n) & $PFix & '.EXE')
If $PID <> 0 Then
$hWnd = WinWait("[CLASS:TTOTAL_CMD]")
WinActivate($hWnd)
EndIf
EndIf |
|
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Mar 07, 2019 19:12 Post subject: |
|
|
Skif_off wrote: | только процессор тр... теребить | От несколько миллисекунд ему хуже не станет. Это не проблема. Хотя всегда брал 40, пусть и тут будет.
Skif_off wrote: | И проще $PID проверить, прежде чем снова теребить | Что значит "снова"? Вопрос не в простоте, а в надёжности. В случае возврата 0-ля активации не будет. Логика.
WinActivate(WinWait("[CLASS:TTOTAL_CMD]")) при нескольких экземплярах не годится.
Что делает WinWaitActive я в курсе. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Thu Mar 07, 2019 22:41 Post subject: |
|
|
Flasher wrote: | От несколько миллисекунд ему хуже не станет. Это не проблема. |
Если окно появляется через 200 мс после запуска, то к чему, грубо говоря, две сотни раз его искать вместо 2-3х?
Flasher wrote: | Вопрос не в простоте, а в надёжности. В случае возврата 0-ля активации не будет. Логика. |
В случае возврата 0-ля активация и не нужна: это значит, что функция Run() не сработала и не вернула PID процесса - активировать нечего.
Flasher wrote: | WinActivate(WinWait("[CLASS:TTOTAL_CMD]")) при нескольких экземплярах не годится. |
WinWaitActive("[CLASS:TTOTAL_CMD]") при нескольких экземплярах тоже не годится, например, в другой копии любое окно с флагом MB_SYSTEMMODAL или с указанным родительским активирует её. Активность окна в любом случае не самый удачный признак нужного (в начале скрипта при получении дескриптора для WM_CLOSE тоже). |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Mar 07, 2019 23:09 Post subject: |
|
|
Skif_off wrote: | то к чему, грубо говоря, две сотни раз его искать вместо 2-3х? | 2 сотни с потолка взято, я так понимаю?
Skif_off wrote: | это значит, что функция Run() не сработала | Ничего подобного. Это вполне может значить, что она не успела получить PID.
WinWaitActive годится, т.к. ждёт активации, а не уже активного окна. И модальность тут за уши притягивать смысла нет, т.к. закрывался активный экземпляр. Плюс мне было на чём проверять, это не чьи-то домыслы, а подтверждено на практике. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Skif_off
Joined: 28 Nov 2012 Posts: 1232
|
(Separately) Posted: Fri Mar 08, 2019 10:57 Post subject: |
|
|
Flasher wrote: | 2 сотни с потолка взято, я так понимаю? |
Ты "грубо говоря" забыл зацепить.
Flasher wrote: | Ничего подобного. Это вполне может значить, что она не успела получить PID. |
Т.е. процесс создан, во всю рисует окно, а у тебя PID всё ещё не получен? Загугли описание CreateProcess, оно везде одинаковое:
Quote: | Return Value
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. ...
Note that the function returns before the process has finished initialization. |
Flasher wrote: | WinWaitActive годится, т.к. ждёт активации, а не уже активного окна. И модальность тут за уши притягивать смысла нет, т.к. закрывался активный экземпляр. Плюс мне было на чём проверять, это не чьи-то домыслы, а подтверждено на практике. |
Годится, если активным не успело вылезти окно другой копии, модальность тут - пример причины, когда это происходит без участия и желания пользователя.
Ну а на моей практике с двумя и более копиями (не только тестов, но просто использования) неприлично часто бывало, что не то окно закрыто или не то активировано. Ты ведь не думаешь, что от нечего делать у себя получаю PID родительской копии TC вместо поиска активного окна?
P.S. К слову, с COM-объектами могут быть сюрпризы в WinPE. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Mar 08, 2019 11:13 Post subject: |
|
|
Skif_off
У меня, честно говоря, нет желания тебе разжёвывать всё (невозврат PID, наличие окна другого экземпляра следом за текущим, COM на WinPE), что давно и перед обновлением пройдено мной на практике в разных ипостасях. Я этот скрипт не для себя писал. Мне это обсуждение в рамках темы малоинтересно. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|