首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

NSIS安装程序完成后运行程序,不在最前端。该怎么解决

2013-01-25 
NSIS安装程序完成后运行程序,不在最前端。用NSIS打包程序,安装完成后如果勾选了“运行 XXX程序”,程序运行后

NSIS安装程序完成后运行程序,不在最前端。
用NSIS打包程序,安装完成后如果勾选了“运行 XXX程序”,程序运行后是不会最前端显示的(就是会被其它窗口遮挡)。但是用Inno打包就可以。自己开发一个打包程序估计也可以。那怎么解决NSIS打包程序的这个问题呢?谢谢!
[解决办法]
那段脚本虽然有些错误,但我还是能看出它的思想的
; Check if already running, If so don't open another but bring to front
这句注释说的也是安装程序,后面判断的$(^Name)就是安装程序的名字

给你写了个Demo,是运行记事本的,你自己看着办吧:

SetCompressor lzma
!include "MUI.nsh"
!insertmacro MUI_PAGE_INSTFILES
!define MUI_FINISHPAGE_RUN "notepad.exe"
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "SimpChinese"

Name "Test"
OutFile "Setup.exe"

Section
SectionEnd

;下面的代码不写,记事本一样可以最前端显示
Function .onInstSuccess
loop:
  FindWindow $0 "Notepad" "无标题 - 记事本"
  StrCmp $0 0 loop
  System::Call User32::SetForegroundWindow(ir0)
FunctionEnd




[解决办法]

引用:
谢谢!原来把这些定义写在“!insertmacro MUI_PAGE_FINISH”之前是关键啊。。唉。。写在后面就不会生效了。

如你所说,利用这些来解决窗口前置问题貌似不行。我试了下!define MUI_FINISHPAGE_RUN_FUNCTION finishpageaction,然后在这个函数里面loop,但发现这个函数先于程序启动而执行。。所以就会一直l……

一直 loop 肯定不行,窗口找不到肯定一直都是 0,无限循环了。不管你是用:
!define MUI_FINISHPAGE_RUN_FUNCTION myFuncXXX
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION myFuncYYY
还是:
!define MUI_PAGECUSTOMFUNCTION_LEAVE finishpageaction
还是直接使用内置回调函数 .onInstSuccess 都不是解决问题的关键。
如果是下面这两个方案,用 HideWindows 把窗体隐藏就不会出现卡死不关闭的情况了。

热点排行