Установить положение курсора во время выполнения в диалоговом окне страницы каталога - NSIS - PullRequest
0 голосов
/ 23 января 2019

Я хочу добавить в конце пути имя папки установки моего приложения. Я делаю это успешно после нажатия кнопки «Обзор», но после многих попыток я не смог этого сделать, если я изменил текст прямо в текстовом поле.

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 голосов
/ 23 января 2019

NSIS должен сделать это за вас.

Из документов:

... часть этой строки, следующая за последней \, будет использоваться, если пользовательвыбирает 'browse' и может быть добавлен обратно к строке во время установки (чтобы отключить это, закройте каталог с помощью \ (что потребует заключить весь параметр в кавычки). Если это не имеет никакого смысла, поиграйте с кнопкой обзора немного.

Значение,

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.

...