Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Рестарт/перезапуск TC
Goto page Previous  1, 2, 3 ... 10, 11, 12
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Avada



Joined: 01 Aug 2008
Posts: 9351
Location: Россия, Саратов

Post (Separately) Posted: Wed Mar 06, 2019 18:25    Post subject: Reply with quote

Flasher
Попробовал последний вариант. Кнопка (скрипт с параметром) работает нормально. Но точно такая же юзер-команда вызывает размножение окон TC. В чём может быть дело? Пока использую предыдущую версию, там у меня вроде как всё OK.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13810
Location: Москва

Post (Separately) Posted: Wed Mar 06, 2019 19:26    Post subject: Reply with quote

Avada
Так происходит при вызове с хоткея (Какого?) или и с кнопки с юзеркомандой тоже?
Под размножением окон ты подразумеваешь зацикливание создания экземпляров?
На чистом ТС без плагинов подобное наблюдается?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 9351
Location: Россия, Саратов

Post (Separately) Posted: Wed Mar 06, 2019 21:10    Post subject: Reply with quote

Flasher
И с кнопки с юзер-командой, и при её запуске из командной строки TC, и хотееем для неё, без разницы. А с экземплярами там не зацикливание, а именно приращение. Допустим, у меня единственный 32-битный экземпляр без номера в заголовке. Выполняется команда. Открывается второе окно для 64-битного TC с (2) в заголовке. Выполняем в нём команду. 32-битная версия теперь открывается в третьем окне при сохранении прежних окон... и так далее. На чистом TC (только с юзер-командами) — та же история.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13810
Location: Москва

Post (Separately) Posted: Thu Mar 07, 2019 02:05    Post subject: Reply with quote

Avada
Т.е. ты просто хочешь сказать, что исходный экземпляр не закрывается? С учётом ProcessWaitClose(WinGetProcess($hWnd)) это довольно странная история, т.к. до открытия нового скрипт должен ждать бесконечно долго, пока не завершится процесс ТС. И только лишь с добавкой двух завершающих в условии элементов активации окна в этой части измениться ничего точно не могло. Либо ты слукавил насчёт последней редакции (дописка была и в предыдущем варианте без шапки).
И речь сейчас идёт только про скомпилированный случай? Или с актуальным AutoIt3.exe та же история? Компилятор Aut2exe.exe тоже актуальный?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 9351
Location: Россия, Саратов

Post (Separately) Posted: Thu Mar 07, 2019 08:31    Post subject: Reply with quote

Flasher
Да, исходный экземпляр не закрывался. Но там, как выяснилось, результаты менялись несколько раз по непонятным причинам. Поэтому сегодня всё протестировал заново на той машине, где AutoIt3.exe и Aut2exe.exe использованы заведомо актуальные. Всё работает отовсюду, в том числе и в варианте c EXE. Видимо, на этом проблему можно считать закрытой.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13810
Location: Москва

Post (Separately) Posted: Thu Mar 07, 2019 12:55    Post subject: Reply with quote

Avada
Ну, и отлично. Так и думал, что дело в версии.

Сделал активацию ещё более стабильной.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1131

Post (Separately) Posted: Thu Mar 07, 2019 18:46    Post subject: Reply with quote

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
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13810
Location: Москва

Post (Separately) Posted: Thu Mar 07, 2019 19:12    Post subject: Reply with quote

Skif_off wrote:
только процессор тр... теребить
От несколько миллисекунд ему хуже не станет. Это не проблема. Хотя всегда брал 40, пусть и тут будет.

Skif_off wrote:
И проще $PID проверить, прежде чем снова теребить
Что значит "снова"? Вопрос не в простоте, а в надёжности. В случае возврата 0-ля активации не будет. Логика.
WinActivate(WinWait("[CLASS:TTOTAL_CMD]")) при нескольких экземплярах не годится.
Что делает WinWaitActive я в курсе.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1131

Post (Separately) Posted: Thu Mar 07, 2019 22:41    Post subject: Reply with quote

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
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13810
Location: Москва

Post (Separately) Posted: Thu Mar 07, 2019 23:09    Post subject: Reply with quote

Skif_off wrote:
то к чему, грубо говоря, две сотни раз его искать вместо 2-3х?
2 сотни с потолка взято, я так понимаю?
Skif_off wrote:
это значит, что функция Run() не сработала
Ничего подобного. Это вполне может значить, что она не успела получить PID.
WinWaitActive годится, т.к. ждёт активации, а не уже активного окна. И модальность тут за уши притягивать смысла нет, т.к. закрывался активный экземпляр. Плюс мне было на чём проверять, это не чьи-то домыслы, а подтверждено на практике.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1131

Post (Separately) Posted: Fri Mar 08, 2019 10:57    Post subject: Reply with quote

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
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 13810
Location: Москва

Post (Separately) Posted: Fri Mar 08, 2019 11:13    Post subject: Reply with quote

Skif_off
У меня, честно говоря, нет желания тебе разжёвывать всё (невозврат PID, наличие окна другого экземпляра следом за текущим, COM на WinPE), что давно и перед обновлением пройдено мной на практике в разных ипостасях. Я этот скрипт не для себя писал. Мне это обсуждение в рамках темы малоинтересно.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... 10, 11, 12
Page 12 of 12

 
Jump to:  
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