!AddPluginDir .
!include "MUI.nsh"
;!include "WinCore.nsh"
!define SHACF_FILESYSTEM 0x00000001
!define EN_CHANGE 0x0300
Name "安装目录选择与组件选择页面完美合一"
OutFile "Example.exe"
InstallDir $TEMP
ShowInstDetails show
!define MUI_COMPONENTSPAGE_NODESC
!define MUI_UI_COMPONENTSPAGE_NODESC myui.exe
!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirPageShow
!insertmacro MUI_PAGE_DIRECTORY ;作为第一个页面,但不会显示
!define MUI_PAGE_CUSTOMFUNCTION_SHOW HideBack
!insertmacro MUI_PAGE_LICENSE ${__FILE__} ;在第二个页面隐藏上一步按钮
!define MUI_COMPONENTSPAGE_TEXT_INSTTYPE $(^DirBrowseText) ;浏览对话框文本可用安装类型组合框旁的文本代替
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ComPageShow
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "SimpChinese"
Section "主程序" Main
SectionIn RO
AddSize 500
DetailPrint "$INSTDIR"
SectionEnd
Section /o "测试区段1" Sec01
AddSize 500
DetailPrint "测试区段1"
SectionEnd
Section "测试区段2" Sec02
AddSize 500
DetailPrint "测试区段2"
SectionEnd
Function DirPageShow
FindWindow $1 "#32770" "" $HWNDPARENT
# 这里使用了$R0保存目录选择页面的过程函数地址,后面要避免使用$R0保存其它数据;
# 如不可避免的要使用$R0作临时变量,则应注意保护变量
System::Call User32::GetWindowLong(ir1,i4)i.R0
SendMessage $HWNDPARENT 0x408 1 0
FunctionEnd
Function HideBack
GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 ${SW_HIDE}
FunctionEnd
Function ComPageShow
FindWindow $1 "#32770" "" $HWNDPARENT
GetFunctionAddress $0 onComPageCallback
;WndSubclass::S $R0 $0
;Pop $0
WndProc::onCallback /r=1 $1 $0
GetDlgItem $0 $1 1001
SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^BrowseBtn)"
GetDlgItem $0 $1 1007
SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^DirText)"
GetDlgItem $0 $1 1020
SendMessage $0 ${WM_SETTEXT} 0 "STR:$(^DirSubText)"
GetDlgItem $0 $1 1019
SendMessage $0 ${WM_SETTEXT} 0 "STR:$INSTDIR"
# 输入路径时自动匹配显示下拉列表显示系统中已存在的文件或文件夹
System::Call `shlwapi::SHAutoComplete(ir0,i${SHACF_FILESYSTEM})`
FunctionEnd
Function onComPageCallback
${If} $2 = ${WM_COMMAND}
IntOp $5 $3 & 0x0000FFFF
IntOp $6 $3 >> 16
IntOp $6 $6 & 0x0000FFFF
${If} $6 = ${EN_CHANGE}
${AndIf} $5 = 1019
System::Call User32::GetDlgItemText(ir1,i1019,t.d,i${NSIS_MAX_STRLEN})
${EndIf}
System::Call User32::CallWindowProc(iR0,ir1,ir2,ir3,ir4)
${EndIf}
FunctionEnd
免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。丨本站为个人博客非盈利性站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途。丨本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
BY-NC-SA协议进行授权
转载请注明:永恒心锁-分享互联网 » 安装目录选择与组件选择页面完美合一