用NSIS打包程序,安装完成后如果勾选了“运行 XXX程序”,程序运行后是不会最前端显示的(就是会被其它窗口遮挡)。但是用Inno打包就可以。自己开发一个打包程序估计也可以。那怎么解决NSIS打包程序的这个问题呢?谢谢!
解决方案 »
- 注册表设置
- 急,超难问题
- 如何得到快捷方式对应的实际路径呢?
- 关于PostMessage和SendMessage的问题。 我在一棵树的OnClick事件中要实现点击父,希望选中大儿子.遇到问题.
- 请问如何加载静态库
- 怎么我做了半年的VC,好象还没入门似的,我该怎样来学VC,各位提提意见!!!!!!
- 本人用MFC编程,如何做后台运行程序,此程序不需要窗口支持。
- OpenGL程序员请进:这里有一个超级难题,有那位能解决的,本人定送2600分
- 为什么我编译的对话框上显示的是乱码啊,Help~~~~~~~~~
- 在sql server中使用sum返回值为null,在vc中怎么把它转换为long
- TransmitFile发文件时TRANSMIT_FILE_BUFFERS参数导致的错误
- vc中访问oracle数据库,一个表的字段为timestampe类型,结束时候报错,很奇怪
在网上找到一段脚本——
!Macro "SingleSetup"
BringToFront #使安装程序窗口可见并把它带到其它窗口的最前端
; Check if already running, If so don't open another but bring to front
System::Call "kernel32::CreateMutexA(i 0, i 0, t '$(^Name)') i .r0 ?e"
Pop $0
StrCmp $0 0 launch
StrLen $0 "$(^Name)"
IntOp $0 $0 + 1
loop:
FindWindow $1 '#32770' '' 0 $1
IntCmp $1 0 +4
System::Call "user32::GetWindowText(i r1, t .r2, i r0) i."
StrCmp $2 "$(^Name)" 0 loop
System::Call "user32::ShowWindow(i r1,i 9) i." ; If minimized then maximize
System::Call "user32::SetForegroundWindow(i r1) i." ; Bring to front
Abort
launch:
!macroend
地址是这个但是完全不知道应该在哪个位置调用,有人指教下吗?
#使安装程序窗口可见并把它带到其它窗口的最前端
; 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
如果可以开线程loop就好了,不然CPU使用率特高。是不是可以用System::Call User32::CreateThread 开线程呢?呵呵。不行的话就System::Call User32::Sleep 一下?这些办法是否常规呢?还有要判断到底有没有勾选安装完毕后运行XXX程序,这个。。又或者是给loop加个限时?脚本如何写?求常规做法。。谢谢。。
在这个网页里找到的
!define MUI_FINISHPAGE_RUN_TEXT "运行XXX程序"
#!define MUI_FINISHPAGE_RUN_PARAMETERS "/S" #如果需要参数就添加此定义
#!define MUI_FINISHPAGE_RUN_NOTCHECKED #不选中
!define MUI_FINISHPAGE_RUN_FUNCTION myFuncXXX
!define
!define MUI_FINISHPAGE_SHOWREADME
!define MUI_FINISHPAGE_SHOWREADME_TEXT "运行YYY程序"
#!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED #不选中
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION myFuncYYYFunction myFuncXXX
# 勾选"运行XXX程序"
FunctionEndFunction myFuncYYY
# 勾选"运行YYY程序"
FunctionEnd不过是不能解决你那个窗口前置的问题的。
!define MUI_FINISHPAGE_RUN_FUNCTION myFuncXXX
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION myFuncYYY
还是:
!define MUI_PAGECUSTOMFUNCTION_LEAVE finishpageaction
还是直接使用内置回调函数 .onInstSuccess 都不是解决问题的关键。
如果是下面这两个方案,用 HideWindows 把窗体隐藏就不会出现卡死不关闭的情况了。