在NSIS中调用两个浏览器窗口时,如何确保最后一个获得焦点?

时间:2011-05-17 20:33:52

标签: internet-explorer focus uac nsis timing

我有这个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 , 有时我会在 FIRST 前面的 SECOND 窗口。

我的猜测是,由于 FIRST 窗口需要随机时间打开和 如果 SECOND 窗口在 FIRST 之前完成打开,那么 FIRST 将获得焦点并位于顶部。

是否有人有解决方案确保 SECOND 窗口具有焦点?

谢谢!

2 个答案:

答案 0 :(得分:2)

这不是一个简单的问题,因为打开网页是异步的:您不知道加载何时完成。一个优雅的解决方案是从浏览器获得第一页已加载的反馈,但由于您必须支持每个浏览器,因此需要做很多工作。顺便说一下,你强制使用IE,这不是一个好主意,你应该使用用户的默认浏览器

也许某些AutoIt脚本可以观看并等待浏览器窗口/标签打开。

或者只是在两次通话之间等待几秒钟。

<强> 修改

请参阅this post and this one too

答案 1 :(得分:1)

使用这个简单的循环将所需的窗口放在前面。 (我使用了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)"