在目录页面对话框中设置运行时光标位置-NSIS

时间:2019-01-23 16:38:15

标签: nsis

我想在路径末尾添加我的应用程序的安装文件夹名称。单击“浏览”按钮后,我成功完成了此操作,但是经过许多尝试,如果直接在文本框中修改文本,我将无法完成操作。

Function .onVerifyInstDir
    Push $0
        FindWindow $0 "#32770" "" $HWNDPARENT
        GetDlgItem $0 $0 0x3FB
    ;in alternative for MUI >2.0 I could use directly $mui.DirectoryPage.Directory. Is it right?

    ;does path end with "\MyApp"?
    StrLen $R1 "\${APP_FOLDER_NAME}"
    StrCpy $R0 $INSTDIR "" -$R1
    StrCmp $R0 "\${APP_FOLDER_NAME}" +2

        ;add "\MyApp" after browse button clicking (OK)
    StrCpy $INSTDIR "$INSTDIR\${APP_FOLDER_NAME}"

        ;add "\MyApp" after typing directly into the textbox but the cursor position reset to the first character. Tried to solve saving the current cursor position and then reapply it (NOK)
        SendMessage $0 ${EM_GETSEL} null $1
          SendMessage $0 ${WM_SETTEXT} 0 "STR:$INSTDIR"
    SendMessage $0 ${EM_SETSEL} $1 $1
FunctionEnd

我无法在修改路径字符串的地方保留光标,并且总是将其重置为第一个字符。

在安装过程的上一个阶段,我按照以下步骤初始化安装路径

StrCpy $INSTDIR "$APPDATA\${APP_FOLDER_NAME}"

1 个答案:

答案 0 :(得分:0)

NSIS应该已经为您做到这一点。

从文档中

  

...如果用户选择“浏览”,则将使用该字符串中最后一个\之后的部分,并且可以在安装时将其附加回该字符串(要禁用此功能,请在目录末尾加上\((这将要求整个参数都用引号引起来。)如果这没有任何意义,请稍微浏览一下浏览按钮。

含义

InstallDir "$ProgramFiles\MyApp"

不同
InstallDir "$ProgramFiles\MyApp\"

不正式支持在.onVerifyInstDir中设置文本,但是此代码有些起作用:

!define APP_FOLDER_NAME MyApp
Page Directory
Page InstFiles

!include WinMessages.nsh
!include LogicLib.nsh

Function .onInit
StrCpy $INSTDIR "$APPDATA\${APP_FOLDER_NAME}"
FunctionEnd

Var InOnVerifyInstDir
Var SeenModal

Function .onVerifyInstDir
${IfThen} $InOnVerifyInstDir <> 0 ${|} Return ${|} ; Don't recurse into .onVerifyInstDir
!if ${MUI_SYSVERSION} >= 2.0
    StrCpy $0 $mui.DirectoryPage.Directory
!else
    FindWindow $0 "#32770" "" $hWndParent
    GetDlgItem $0 $0 0x3FB
!endif

    System::Call 'USER32::GetActiveWindow()p.r2'
    System::Call 'USER32::GetFocus()p.r1'
    ${If} $1 P<> $0 
        ${If} $hWndParent P<> $2
            StrCpy $SeenModal 1
            Return
        ${EndIf}
        ${If} $SeenModal = 0
            Return
        ${EndIf}
    ${EndIf}
    StrCpy $SeenModal ""

    ;does path end with "\MyApp"?
    StrLen $R1 "\${APP_FOLDER_NAME}"
    StrCpy $R0 $INSTDIR "" -$R1
    ${If} $R0 != "\${APP_FOLDER_NAME}"
        StrCpy $InOnVerifyInstDir 1
        StrCpy $INSTDIR "$INSTDIR\${APP_FOLDER_NAME}"
        SendMessage $0 ${EM_GETSEL} "" "" $1
        IntOp $1 $1 >> 16    ; shift hiword
        IntOp $1 $1 & 0xffff ; mask possible sign bit
        SendMessage $0 ${WM_SETTEXT} 0 "STR:$INSTDIR"
        SendMessage $0 ${EM_SETSEL} $1 $1
        StrCpy $InOnVerifyInstDir 0
    ${EndIf}
FunctionEnd

但是我仍然建议仅使用InstallDir