Рестарт/перезапуск TC
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2, 3 ... 10, 11, 12  :| |:
Total Commander -> Автоматизация Total Commander

#166:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 18:25
    —
Flasher
Попробовал последний вариант. Кнопка (скрипт с параметром) работает нормально. Но точно такая же юзер-команда вызывает размножение окон TC. В чём может быть дело? Пока использую предыдущую версию, там у меня вроде как всё OK.

#167:  Author: FlasherLocation: Москва PostPosted: Wed Mar 06, 2019 19:26
    —
Avada
Так происходит при вызове с хоткея (Какого?) или и с кнопки с юзеркомандой тоже?
Под размножением окон ты подразумеваешь зацикливание создания экземпляров?
На чистом ТС без плагинов подобное наблюдается?

#168:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Mar 06, 2019 21:10
    —
Flasher
И с кнопки с юзер-командой, и при её запуске из командной строки TC, и хотееем для неё, без разницы. А с экземплярами там не зацикливание, а именно приращение. Допустим, у меня единственный 32-битный экземпляр без номера в заголовке. Выполняется команда. Открывается второе окно для 64-битного TC с (2) в заголовке. Выполняем в нём команду. 32-битная версия теперь открывается в третьем окне при сохранении прежних окон... и так далее. На чистом TC (только с юзер-командами) — та же история.

#169:  Author: FlasherLocation: Москва PostPosted: Thu Mar 07, 2019 02:05
    —
Avada
Т.е. ты просто хочешь сказать, что исходный экземпляр не закрывается? С учётом ProcessWaitClose(WinGetProcess($hWnd)) это довольно странная история, т.к. до открытия нового скрипт должен ждать бесконечно долго, пока не завершится процесс ТС. И только лишь с добавкой двух завершающих в условии элементов активации окна в этой части измениться ничего точно не могло. Либо ты слукавил насчёт последней редакции (дописка была и в предыдущем варианте без шапки).
И речь сейчас идёт только про скомпилированный случай? Или с актуальным AutoIt3.exe та же история? Компилятор Aut2exe.exe тоже актуальный?

#170:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Mar 07, 2019 08:31
    —
Flasher
Да, исходный экземпляр не закрывался. Но там, как выяснилось, результаты менялись несколько раз по непонятным причинам. Поэтому сегодня всё протестировал заново на той машине, где AutoIt3.exe и Aut2exe.exe использованы заведомо актуальные. Всё работает отовсюду, в том числе и в варианте c EXE. Видимо, на этом проблему можно считать закрытой.

#171:  Author: FlasherLocation: Москва PostPosted: Thu Mar 07, 2019 12:55
    —
Avada
Ну, и отлично. Так и думал, что дело в версии.

Сделал активацию ещё более стабильной.

#172:  Author: Skif_off PostPosted: Thu Mar 07, 2019 18:46
    —
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

#173:  Author: FlasherLocation: Москва PostPosted: Thu Mar 07, 2019 19:12
    —
Skif_off wrote:
только процессор тр... теребить
От несколько миллисекунд ему хуже не станет. Это не проблема. Хотя всегда брал 40, пусть и тут будет.

Skif_off wrote:
И проще $PID проверить, прежде чем снова теребить
Что значит "снова"? Вопрос не в простоте, а в надёжности. В случае возврата 0-ля активации не будет. Логика.
WinActivate(WinWait("[CLASS:TTOTAL_CMD]")) при нескольких экземплярах не годится.
Что делает WinWaitActive я в курсе.

#174:  Author: Skif_off PostPosted: Thu Mar 07, 2019 22:41
    —
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 тоже).

#175:  Author: FlasherLocation: Москва PostPosted: Thu Mar 07, 2019 23:09
    —
Skif_off wrote:
то к чему, грубо говоря, две сотни раз его искать вместо 2-3х?
2 сотни с потолка взято, я так понимаю?
Skif_off wrote:
это значит, что функция Run() не сработала
Ничего подобного. Это вполне может значить, что она не успела получить PID.
WinWaitActive годится, т.к. ждёт активации, а не уже активного окна. И модальность тут за уши притягивать смысла нет, т.к. закрывался активный экземпляр. Плюс мне было на чём проверять, это не чьи-то домыслы, а подтверждено на практике.

#176:  Author: Skif_off PostPosted: Fri Mar 08, 2019 10:57
    —
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.

#177:  Author: FlasherLocation: Москва PostPosted: Fri Mar 08, 2019 11:13
    —
Skif_off
У меня, честно говоря, нет желания тебе разжёвывать всё (невозврат PID, наличие окна другого экземпляра следом за текущим, COM на WinPE), что давно и перед обновлением пройдено мной на практике в разных ипостасях. Я этот скрипт не для себя писал. Мне это обсуждение в рамках темы малоинтересно.



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2, 3 ... 10, 11, 12  :| |:
Page 12 of 12

Powered by phpBB © 2001, 2005 phpBB Group