При вызове двух окон браузера в NSIS, как убедиться, что последнее получает фокус? - PullRequest
0 голосов
/ 18 мая 2011

У меня есть этот скрипт nsis,

...

nsExec::Exec "openFirstWindow.exe"  ;HERE This exe will open a FIRST WINDOW to whatever url

Pop $exe_return_code
StrCmp $exe_return_code "0" exe_success
Goto exe_done
exe_success:
    ;HERE is the call to the SECOND WINDOW
    UAC::Exec '' '"$PROGRAMFILES\Internet Explorer\iexplore.exe" "http://www.google.ca"' '' ''

exe_done:

...

Проблема в том, что случайно я получаю окно FIRST на переднем плане и SECOND позади, и иногда я получаю окно SECOND перед FIRST .

Я предполагаю, что это происходит из-за того, что окно FIRST требует случайного времени для открытия и если окно SECOND заканчивает открываться до FIRST , то FIRST получит фокус и окажется сверху.

У кого-нибудь есть решение, чтобы убедиться, что у окна SECOND есть фокус?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Это не простая проблема, потому что открытие веб-страницы происходит асинхронно: вы не знаете, когда загрузка закончилась.Элегантным решением было бы получить обратную связь от браузера, загрузившего первую страницу, но это большая работа, так как вам придется поддерживать каждый браузер.Если вы принудительно используете IE, это не очень хорошая идея, вы должны использовать браузер пользователя по умолчанию

Может быть, какой-то скрипт AutoIt может смотреть и ждать, пока окно / вкладка браузераоткрыть.

Или просто подождите несколько секунд между обоими вызовами.

РЕДАКТИРОВАТЬ

См. этот пост и этот тоже

1 голос
/ 23 мая 2011

Используйте эту простую петлю, чтобы вывести необходимое окно впереди.(Я использовал Exec, но отлично работает с UAC и nsExec)

; This Window is opened as first
Exec '"$PROGRAMFILES\Internet Explorer\iexplore.exe" "www.google.sk"' 
; This is opened later
Exec '"$PROGRAMFILES\Internet Explorer\iexplore.exe" "www.unsigned-softworks.sk/installer"'  

CheckWindow:
  Sleep 500 ; Wait some time (miliseconds)

  ; Find by Window class and by Window name 
  FindWindow $1 "IEFrame" "Google - Windows Internet Explorer" 

  ; If window is not found (not loaded!) search again 
  IntCmp $1 0 CheckWindow Continue Continue

Continue:
  # If found (opened & loaded), bring it to front
  System::Call "User32::SetForegroundWindow(i) b ($1)"
...