Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Cyberworm, Такое может быть под 64-бит системой. Путь для InstallDirRegKey надо указывать "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 17470"
Cyberworm
05-01-2020, 22:10
Cyberworm, Такое может быть под 64-бит системой. Путь для InstallDirRegKey надо указывать "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 17470" »
Это дохлый номер, потому что клиент Steam прописывает основные данные игр только в ветке "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\******"
В данной директории "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 17470" вообще ничего нет, как и самой важной ветки Steam App 17470. Я скомпилировал ради теста твой вариант с Wow6432Node, но это результатов не принесло.
Cyberworm, Что-то я слона сразу не приметил :)
HKEY_LOCAL_MACHINE\ удалить надо.
Какие, кстати? версия NSIS и разрядность Steam и Windows?
Только что проверил. Как-то непонятно этот InstallDirRegKey работает - из HKCU читает, а из HKLM - нет
Обходной путь - установка значения $INSTDIR в .onInit:Name "RegReadTest"
Unicode true
RequestExecutionLevel admin
SetOverwrite on
SetCompressor LZMA
OutFile "RegReadTest.exe"
page directory
page instfiles
Function .onInit
SetRegView 64
Push $0
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\WinRAR archiver" "InstallLocation"
IfErrors 0 +3
MessageBox MB_OK "Программа ХХХ не установлена!"
Quit
StrCpy $INSTDIR $0
Pop $0
FunctionEnd
Section ""
MessageBox MB_OK "Установка в папку:$\n $INSTDIR"
SectionEnd
Cyberworm
06-01-2020, 13:05
Какие, кстати? версия NSIS и разрядность Steam и Windows? »
Windows 10 Professional x64 и NSIS 3.05 взял с официального сайта. Версию NSIS x64 надо компилировать из исходников. Steam распространяется только в стандартной 32-битной версии. Вот поэтому я и решил разобрать этот вопрос здесь, потому что команда InstallDirRegKey действительно должным образом не работает. Точнее работает с исключениями или даже ограничениями. Сейчас попробую твой вариант с назначением переменной в .onInit
Всем привет.
Возникла следующая проблема:
Необходимо задать картинку в качестве MUI_HEADERIMAGE_BITMAP. С этим проблем нет. Картинка строго по ширине окна инсталлятора.
После попытки задать $mui.Header.Text и $mui.Header.SubText они становятся невидимыми. Это тоже не проблема, обошел примерно так:
GetDlgItem $8 $HWNDPARENT 0x416 ; Header image
GetDlgItem $9 $HWNDPARENT 0x40A ; Header
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
b ($8, $9, 0, 0, 497, 57, 0)"
Только при этом координаты Text и SubText хедера теперь не прижаты к левому краю.
Пытаюсь так менять координаты:
System::Call "*${stRECT} .r1"
System::Call "User32::GetWindowRect(i, i) i ($mui.Header.Text, r1) .r2"
System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"
IntOp $6 $4 - $2
IntOp $7 $5 - $3
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
b ($mui.Header.Text, 0, 20, 15, ir6, ir7, 0" ;
Если задавать MUI_HEADER_TRANSPARENT_TEXT, то текст не отображается. В противном случае, текст отображается только после возврата на страницу со следующей. Также надписи накладываются друг на друга.
Для текста цвета задаются так:
CreateFont $2 "$(^Font)" "9" "700"
SendMessage $mui.Header.Text ${WM_SETFONT} $2 0
SetCtlColors $mui.Header.Text "0x0F0FAF" "transparent"
Был бы благодарен за помощь!
mss307, лучше код привести того, что не получается вместо этих обрывков, ибо есть подозрение на велосипедостроение..
Да, конечно, овнокодинг и велосипедостроение.
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "..\img\test_top_logo.bmp"
!define MUI_HEADER_TRANSPARENT_TEXT
!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH
(...)
# LICENSE PAGE
!define MUI_PAGE_HEADER_TEXT "End User License Agreement"
!define MUI_PAGE_HEADER_SUBTEXT "Please read the following license agreement \
carefully"
!define MUI_PAGE_CUSTOMFUNCTION_PRE LicensePagePre
!define MUI_LICENSEPAGE_CHECKBOX
!insertmacro MUI_PAGE_LICENSE "..\..\..\EULA\LICENSE.rtf"
(...)
Function LicensePagePre
${If} 1 == $GoToFinish
Abort
${EndIf}
Call ChangeHeaderTextPos
FunctionEnd
(...)
Function ${un}ChangeHeaderTextPos
System::Call "*${stRECT} .r1"
System::Call "User32::GetWindowRect(i, i) i ($mui.Header.Text, r1) .r2"
System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"
IntOp $6 $4 - $2
IntOp $7 $5 - $3
MessageBox MB_OK "$4-$2=$6 $5-$3=$7"
!define ${un}HWND_TOPMOST -1
; System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
; b ($mui.Header.Text, ${HWND_TOPMOST}, 20, 15, ir6, ir7, ${SWP_NOMOVE}|${SWP_NOSIZE})" ; hwnd hwndafterZdepth x y w h flags
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
b ($mui.Header.Text, 0, 20, 15, ir6, ir7, 0" ; hwnd hwndafterZdepth x y w h flags
CreateFont $2 "$(^Font)" "9" "700"
SendMessage $mui.Header.Text ${WM_SETFONT} $2 0
SetCtlColors $mui.Header.Text "0x0F0FAF" "transparent"
System::Call "*${stRECT} .r1"
System::Call "User32::GetWindowRect(i, i) i ($mui.Header.Text, r1) .r2"
System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"
IntOp $6 $4 - $2
IntOp $7 $5 - $3
MessageBox MB_OK "$4-$2=$6 $5-$3=$7"
CreateFont $3 "$(^Font)" "8" "700"
SendMessage $mui.Header.SubText ${WM_SETFONT} $3 0
SetCtlColors $mui.Header.SubText "0x0F0FAF" "transparent"
System::Call "*${stRECT} .r1"
System::Call "User32::GetWindowRect(i, i) i ($mui.Header.SubText, r1) .r2"
System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"
IntOp $6 $4 - $2
IntOp $7 $5 - $3
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
b ($mui.Header.SubText, 0, 40, 30, ir6, ir7, 0)" ; hwnd hwndafterZdepth x y w h flags
GetDlgItem $8 $HWNDPARENT 0x416 ; Header image
GetDlgItem $9 $HWNDPARENT 0x40A ; Header
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) \
b ($8, $9, 0, 0, 497, 57, 0)" ; hwnd hwndafterZdepth x y w h flags
FunctionEnd »
Text и SubText хедера теперь не прижаты к левому краю »
Добавь !define MUI_HEADERIMAGE_RIGHT
К примеру, в таком виде у меня вроде всё нормально (a1.bmp - моя картинка) :
!include "nsDialogs.nsh"
!include "MUI2.nsh"
OutFile "test.exe"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "c:\Program Files\NSIS\Contrib\Graphics\Header\a1.bmp"
!define MUI_HEADERIMAGE_RIGHT
!define MUI_HEADER_TRANSPARENT_TEXT
Page Custom MyPage
Function MyPage
!insertmacro MUI_HEADER_TEXT "Title text" "Subtitle text"
nsDialogs::Create 1018
Pop $0
GetDlgItem $0 $HWNDPARENT 0x416 ; Header image
GetDlgItem $1 $HWNDPARENT 0x40A ; Header
System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($0, $1, 0, 0, 497, 57, 0)"
nsDialogs::Show
FunctionEnd
!insertmacro MUI_LANGUAGE "English"
Section
SectionEnd
Да, а ларчик просто открывался. Неожиданно, честно говоря. Это так очевидно было?
AlekseyPopovv
18-03-2020, 11:13
Как изменить цвет окна MessageBox?
Никак, это системный диалог.
AlekseyPopovv
22-03-2020, 08:20
Как изменить параметры в *.ini?
Пример:
[Section]
Parameter1=5000
Parameter2=7000
Если эти параметры равны 5000 и 7000, то Parameter2 нужно заменить на 3000
Если параметры не равны 5000 и 7000, то замена не нужна
[Section]
Parameter1=5000
Parameter2=3000
Как это сделать?
ReadINIStr (https://nsis.sourceforge.io/mediawiki/index.php?title=Reference/ReadINIStr), WriteINIStr (https://nsis.sourceforge.io/mediawiki/index.php?title=Reference/WriteINIStr)
Примерно так:ReadINIStr $0 "filename" "section" "param1"
StrCmp $0 5000 0 +4
ReadINIStr $0 "filename" "section" "param2"
StrCmp $0 7000 0 +2
WriteINIStr "filename" "section" "param2" 30000
AlekseyPopovv
28-03-2020, 11:47
Может кто знает как сделать, что бы например файл *.png открывался в программе (сама программа программа поддерживает открытие файла перетягиванием) перетягиванием на лаунчер?
Как исполнительному файлу это передать?
AlekseyPopovv, Если под перетягиванием подразумевается перетягивание файла на ярлык/exe, то !include "FileFunc.nsh"
; В теле секции/функции/макро:
${GetParameters} $0
; В $0 теперь содержатся все параметры, переданные лаунчеру
; Далее можно запустить программу с этими параметрами:
Exec 'program.exe $0'
iglezz, лишние кавычки, обрамляющие имена программы и передаваемого файла, не нужны там?
Iska, Это в качестве домашнего задания :)
Если перетаскиваемый на лаунчер файл имеет в полном пути пробелы, то Проводник (и не только) обрамляет его в кавычки. NSIS эти кавычки не трогает, поэтому строку параметров можно передать в исходном виде.
А если понадобится несколько указанных в параметрах файлов передать в программу по одному, то тогда понадобится немного подумать над алгоритмом разбора и реализовать его. Или поискать готовый...
то Проводник (и не только) »
Так у нас же не Проводник, у нас NSIS. И речь про единственный параметр.
Exec — это в NSIS обёртка над ShellExecute()? Тут: Reference/Exec - NSIS (https://nsis.sourceforge.io/Reference/Exec) этого нет, но про кавычки — кое-что есть.
Так у нас же не Проводник, у нас NSIS. И речь про единственный параметр. »
Но процесс перетаскивания файла на nsis-лаунчер будет происходить при помощи файл-менеджера. Наиболее вероятно, что это будет Проводник.
Понимание необходимости обрамлять в кавычки имя запускаемой команды, по моему, уже должно быть, поэтому уточнил только момент с параметрами, т.к. иногда встречаются "особенности" у некоторых представителей двоичного мира (wsh, total commander)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC