Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wix 在安装并启动应用程序后,应用程序并不总是能达到最高水平_Wix_Windows Installer_Nsis - Fatal编程技术网

Wix 在安装并启动应用程序后,应用程序并不总是能达到最高水平

Wix 在安装并启动应用程序后,应用程序并不总是能达到最高水平,wix,windows-installer,nsis,Wix,Windows Installer,Nsis,我们有一个基于WIX构建的MSI的安装系统。引导程序是NSIS。事情就是这样发展的。现在一切正常,只是有一个小故障 有两个NSIS安装程序。一个用于新用户。按照惯例运行MSI,这样就可以同意他们的合同屏幕。应用程序检查更新,用户可以这样做。这是第二个NSIS包: Section -RA_unzip InitPluginsDir ReadRegStr $R1 HKCU "Software\Company\AppFolder\Property" "Use

我们有一个基于WIX构建的MSI的安装系统。引导程序是NSIS。事情就是这样发展的。现在一切正常,只是有一个小故障

有两个NSIS安装程序。一个用于新用户。按照惯例运行MSI,这样就可以同意他们的合同屏幕。应用程序检查更新,用户可以这样做。这是第二个NSIS包:

Section -RA_unzip
    InitPluginsDir
    ReadRegStr $R1 HKCU "Software\Company\AppFolder\Property" "User Directory"
    SetOutPath $R1
    File "f:\cpp\AppName\deployment\AppName.msi"
    ExecWait 'msiexec /i "$R1\AppName.msi" /L* msi.log /passive /norestart' $0
SectionEnd
      
Section -r_name_dlls
    ReadRegStr $R0 HKCU "Software\Company\AppFolder\Property" "Program Directory"
    Rename $R0\libssl_3.dll $R0\libssl-3.dll
    Rename $R0\libcrypto_3.dll $R0\libcrypto-3.dll
SectionEnd

Section -Finishing Up
    Sleep 1000
SectionEnd

Section -restartRA
    ReadRegStr $R0 HKCU "Software\Company\AppFolder\Property" "Program Directory"
    Exec $R0\ars.exe
    Quit
SectionEnd
不到一半的时间,应用程序会到达Z顺序的顶部。有时它最终会落在底部!这发生在我的Windows7和我妻子的Windows10上。如果我在不影响MSI版本的情况下运行它(它只是在没有安装的情况下退出),那么应用程序窗口将始终位于顶部

我甚至添加了
BringWindowToTop(*GetMainWnd())。我确实认为这与windows安装程序离开缓慢有关,这就是为什么
Sleep 1000
。这没什么区别


唯一可以确定的是,windows installer实际执行安装时会发生这种情况。

Exec
之后直接调用
Quit
不是一个好主意,因为如果安装程序在子进程显示其窗口之前退出,则设置前景窗口的权利将丢失

你可以试试

ExecShell /WAITFORINPUTIDLE "" "$R0\ars.exe"
Sleep 1000
Quit 

如果你知道如何编写Windows软件,你可以尝试创建一个应用程序,在循环中调用GetForeGroundIndow来跟踪活动窗口。嗨@Anders,所以我启动了一个控制台应用程序,它每10毫秒将前台窗口的句柄和窗口名记录到一个文本文件中。事实证明,我们的窗户从来没有到顶部。控制台也被NSIS:Exec调用。控制台窗口保持在顶部。我在文档中找不到任何东西可以改变NSIS:Exec的行为。这对我来说太奇怪了。嗨,安德斯,谢谢。所以我有一个NSIS会话,它只启动记录器,然后是记事本,然后是我的应用程序。我的应用程序中有一半的尝试都是成功的。另一半,在记事本下面。在最近5次测试中,我的应用程序在记事本和控制台窗口下排名前4位。不要从安装程序中执行诊断应用程序,先启动它,不要让它成为活动窗口。我会尝试!谢谢,我很满意。我只是连续运行了30次,每次我的应用程序都在顶部。它与一个平面执行器一起工作。它可能与普通执行器一起工作,但是带有WaitForInputId的ExecShell更好,它会等到孩子开始处理消息。好的,我会这样做。任何减少故障的方法。非常感谢你的帮助。