Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


AlekseyPopovv,
Разница между с MUI и без MUI в том, что
с MUI пишется
Код: Выделить весь код
!insertmacro MUI_LANGUAGE "Russian"
без MUI пишется
Код: Выделить весь код
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
Дальше всё одинаково.

Кроме того локалицацию проще и правильнее прописывать так:
Код: Выделить весь код
; Подключение языковый файлов
; English должен быть первый, т.к. если в списке подключённых языков отсутствует язык системы, то грузится первый по списку
LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"

; Объявление многоязычной строки:
LangString AlreadyRunningMessage ${LANG_ENGLISH} "The "${APP}" is already running!"
LangString AlreadyRunningMessage ${LANG_RUSSIAN} "Программа "${APP}" уже запущена!"

...

; Использование многоязычной строки:
MessageBox MB_USERICON|MB_OK $(AlreadyRunningMessage)
Abort
Если программа уже запущена, то вместо сообщения с прерыванием запуска можно активировать уже запущенный установщик
Пример
Код: Выделить весь код
!include SingleInstance.nsh

RequestExecutionLevel user
Page instfiles
UninstPage uninstConfirm

Section
DetailPrint A
Sleep 1000
DetailPrint B
Sleep 1000
DetailPrint C
Sleep 1000
DetailPrint D
Sleep 1000
SectionEnd
Section un.
SectionEnd

Function .onInit
    ${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}
    WriteUninstaller $EXEDIR\un1.exe
FunctionEnd

Function un.onInit
    ${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}
FunctionEnd

SingleInstance.nsh
Код: Выделить весь код
/*
Based on `Allow only one installer instance` example (https://nsis.sourceforge.io/Allow_only_one_installer_instance)

Usage example:

;  Define unique mutex name (optional)
!define INSTALLERMUTEXNAME "myVeryUniqueInstallerMutexName"
!define UNINSTALLERMUTEXNAME "myVeryUniqueUninstallerMutexName"

${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}

${If} ${AlreadyRunning}
    .. instructions before activate ..
    ${ActivateAlreadyRunning}
    .. instructions after activate ..
    Abort
${EndIf}    
    
*/
!ifndef SingleInstance.nsh
!define SingleInstance.nsh


!include LogicLib.nsh
!include WinMessages.nsh
!include Win\WinError.nsh
!include Win\WinUser.nsh


!define AlreadyRunning `"" AlreadyRunning ""`
!macro _AlreadyRunning _a _b _t _f
    !insertmacro _LOGICLIB_TEMP
    !ifdef __UNINSTALL__
        !define /ifndef UNINSTALLERMUTEXNAME '$(^Name)$(^UninstallCaption) Mutex'
        !define /redef CHECKALREADYEXISTINGMUTEXNAME '${UNINSTALLERMUTEXNAME}'
    !else
        !define /ifndef INSTALLERMUTEXNAME '$(^Name)$(^SetupCaption) Mutex'
        !define /redef CHECKALREADYEXISTINGMUTEXNAME '${INSTALLERMUTEXNAME}'
    !endif
    System::Call 'kernel32::CreateMutex(p 0, i 1, t "${CHECKALREADYEXISTINGMUTEXNAME}") ?e'
    Pop $_LOGICLIB_TEMP
    IntCmpU $_LOGICLIB_TEMP ${ERROR_ALREADY_EXISTS} `${_t}` `${_f}` `${_f}`
!macroend


!define ActivateAlreadyRunning `!insertmacro ActivateAlreadyRunning`
!macro ActivateAlreadyRunning
    Push $0 ; Window handle
    Push $1 ; Caption we are looking for
    Push $2 ; Caption length
    Push $3 ; GetWindowText output
    
    StrCpy $0 '' ; Start FindWindow with NULL
    !ifdef __UNINSTALL__
        StrCpy $1 '$(^UninstallCaption)'
    !else
        StrCpy $1 '$(^SetupCaption)'
    !endif
    StrLen $2 $1
    IntOp $2 $2 + 1 ; GetWindowText count includes \0
    
    ; loop:
    FindWindow $0 '#32770' '' '' $0
    StrCmp $0 0 +5 ; windownotfound: next
    System::Call 'user32::GetWindowText(p r0, t.r3, i r2)'
    StrCmp $3 $1 0 -3 ; windowfound: loop:

    ; windowfound:
    SendMessage $0 ${WM_SYSCOMMAND} ${SC_RESTORE} 0 /TIMEOUT=2000 ; Restore the window if it is minimized
    System::Call 'user32::SetForegroundWindow(p r0)'
    
    ; windownotfound:
    
    Pop $3
    Pop $2
    Pop $1
    Pop $0
!macroend


!define ActivateAlreadyRunningAndAbort `!insertmacro ActivateAlreadyRunningAndAbort`
!macro ActivateAlreadyRunningAndAbort
    ${ActivateAlreadyRunning}
    Abort
!macroend


!endif
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:12, 10-08-2023 | #2772