PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 [71] 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

MKN
17-12-2014, 13:33
Можно ли как-то добавить свой текст на странице прогресса установки (под прогресс баром)? »

Можно так :


OutFile "PAGE_INSTFILES_TXT_Test.exe"
InstallDir "$TEMP"
!include MUI2.nsh
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowTxt
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
; рамка вокруг области текста (если надо)
!define WS_BORDER 0x00800000

Function ShowTxt
; наш текст
StrCpy $R7 "Текст Текст Текст Текст Текст Текст Текст Текст"

FindWindow $R0 "#32770" "" $HWNDPARENT

; создаём окно области текста
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R7",\
i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL}|${WS_BORDER},\
i5,i100,i445,i60,i$R0,i222,i0,i0) i.R2'

; цвет текста & цвет фона области текста
SetCtlColors $R2 `0x0000FF` `0x99FFFF`

; чтобы шрифт был, как и на странице (ессно можно назначить свой)
SendMessage $R0 ${WM_GETFONT} 0 0 $R9
SendMessage $R2 ${WM_SETFONT} $R9 0
FunctionEnd

Section
Sleep 1000
SectionEnd


Варианты флагов для CreateWindowEx и координаты области текста - по вкусу.

Serg866
17-12-2014, 14:42
MKN, благодарю за подробный пример! Всё сработало!
Очень полезная возможность.
А можно ли туда ещё небольшую картинку приделать? Что-то вроде баннера.

MKN
17-12-2014, 17:10
А можно ли туда ещё небольшую картинку приделать? »
Добавь в Function ShowTxt :

!define HWND_TOP 0
!define SWP_NOSIZE 0x0001
!define SWP_NOMOVE 0x0002
!define IDC_BITMAP 1500

; например поместим картинку mypict.bmp ( размер выбран 58x80 - для "вписывания" в уже имеющееся на странице, "хозяйство" )
System::Call 'kernel32::GetModuleHandle(i 0) i.R3'
System::Call 'user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i 220, i 220, i R1, i R2, i $HWNDPARENT, i ${IDC_BITMAP}, i R3, i 0) i.R2'
System::Call 'user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 00, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})'
System::Call `user32::LoadImage(i 0, t "mypict.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $R8
SendMessage $R2 ${STM_SETIMAGE} ${IMAGE_BITMAP} $R8
; этот код обычно в Function .onGUIEnd )
System::Call 'gdi32:DeleteObject(i $R8)'

Ессно надо позаботиться о местонахождении mypict.bmp (обычно в $PLUGINSDIR через Function .onInit )

Serg866
17-12-2014, 19:11
MKN, спасибо, выручаешь. И ещё один вопрос по этой теме.
Команда:
StrCpy $R7 "Текст Текст Текст Текст Текст Текст Текст Текст"

Как в ней делать перенос строки?
$\n не срабатывает(

+если можно, то подскажи, пожалуйста, как добавить ещё 2 строки с текстом над текстом, который в рамке? То есть нужен ещё просто текст над рамкой.

Ну и ещё один момент - текст почему-то редактируемый получается в рамке. Думал это из-за значения EDIT в команде System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R7",\

Попробовал STATIC - текст вообще пропал) Короче у меня руки походу растут не откуда надо)

Serg866
18-12-2014, 00:42
Пока сам поковырял и погуглил по теме. Вроде получилось то что задумал.
http://i68.fastpic.ru/big/2014/1218/b4/fdfa7c3208595b233d3dd173effe50b4.jpg

Могу и код выложить... Но просто он такой ужасный, что при его виде у профи по НСИСУ станет плохо с сердцем. Я даже не знаю как он скомпилировался.

И уточню вопрос в тексте. Хочу, чтоб текст можно было скопировать в буфер, но при этом чтоб нельзя его было изменять в области окна.

Begin2Fly
18-12-2014, 01:02
Serg866, добавьте эту строку к похожим:
SendMessage $R2 ${EM_SETREADONLY} 1 0

Serg866
18-12-2014, 01:10
Begin2Fly, нее, что-то не срабатывает команда

Begin2Fly
18-12-2014, 01:12
Serg866, я добавлял к коду MKN, возможно, вы что-то переделывали.
OutFile "PAGE_INSTFILES_TXT_Test.exe"
InstallDir "$TEMP"

!include MUI2.nsh
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowTxt
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

; рамка вокруг области текста
!define WS_BORDER 0x00800000

Function ShowTxt
; наш текст
StrCpy $R9 "Текст Текст Текст Текст $\r$\n$\r$\n Текст Текст Текст Текст"

FindWindow $R0 "#32770" "" $HWNDPARENT

System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R9",\
i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL}|${WS_BORDER},\
i5,i100,i445,i60,i$R0,i222,i0,i0) i.R2'


; цвет текста & цвет фона
SetCtlColors $R2 `0x0000FF` `0x99FFFF`

SendMessage $R0 ${WM_GETFONT} 0 0 $R9
SendMessage $R2 ${WM_SETFONT} $R9 0
SendMessage $R2 ${EM_SETREADONLY} 1 0
FunctionEnd

Section
Sleep 1000
SectionEnd

Serg866
18-12-2014, 01:17
Begin2Fly , да я наворотил что-то там... Отправил Вам в личку код.
Надо его облагородить.

MKN
18-12-2014, 11:40
текст почему-то редактируемый получается в рамке. »
Потому что гладиолус :) флаг EDIT. Как уже было сказано - играй флагами по вкусу.
Как ты уже правильно хотел сделать, поменяй EDIT на STATIC. И, раз не нужно редактирование, удали не нужные флаги. Т.е. ,будет :

System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R7",i ${WS_CHILD}|${WS_VISIBLE},\
i5,i80,i445,i60,i$R0,i222,i0,i0) i.R2'

WS_CHILD - Дочернее окно.
WS_VISIBLE - Создается окно, которое сразу становится видимым.
По умолчанию окна создаются невидимыми, и для их отображения требуется вызывать функцию ShowWindow .

можно ещё короче :


System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R7",i${DEFAULT_STYLES},\
i5,i80,i445,i60,i$R0,i222,i0,i0) i.R2'

Если нужна прокрутка, оставь ${WS_VSCROLL} (для случая, когда весь текст не вмещается в область созданного окна)
(Если не хочется видеть полосу прокрутки, а текста много - расширь область окна, смести прогресс бар повыше и сделай уже его полоску. Вариантов много.)

ps про всё это уже говорилось в теме

MKN
19-12-2014, 12:50
Serg866,
Вот вариант для PAGE_INSTFILES с собственным окном для текста, с текстом-заголовком над этим окном и картинкой :


OutFile "PAGE_INSTFILES_TXT_Pict_Test.exe"
Name "PAGE_INSTFILES_TXT_Pict"
InstallDir "$TEMP"
!include MUI2.nsh
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowTxt
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
ShowInstDetails nevershow
!define WS_BORDER 0x00800000
!define HWND_TOP 0
!define SWP_NOSIZE 0x0001
!define SWP_NOMOVE 0x0002
!define IDC_BITMAP 1500

Var hBitmap

Function .onInit
InitPluginsDir
File /oname=$PLUGINSDIR\vinni.bmp "vinni.bmp"
FunctionEnd

Function ShowTxt
StrCpy $R9 "Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне"

FindWindow $R0 "#32770" "" $HWNDPARENT

System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R9",\
i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_AUTOVSCROLL}|${WS_BORDER},\
i5,i100,i445,i100,i$R0,i222,i0,i0) i.R1'

SetCtlColors $R1 `0x0000FF` `0x99FFFF`
SendMessage $R0 ${WM_GETFONT} 0 0 $R9
SendMessage $R1 ${WM_SETFONT} $R9 0
SendMessage $R1 ${EM_SETREADONLY} 1 0

StrCpy $R8 "Текст над окном"
System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R8",i ${WS_CHILD}|${WS_VISIBLE},i15,i75,i445,i20,i $R0,i122,i0,i0) i.R5'

SendMessage $R0 ${WM_GETFONT} 0 0 $R8
SendMessage $R5 ${WM_SETFONT} $R8 0

; помещаем на страницу картинку "vinni.bmp" (размеров 58x80)
System::Call `kernel32::GetModuleHandle(i 0) i.R3`
System::Call `user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i370, i110, i58, i80, i $R0, i ${IDC_BITMAP}, i R3, i 0) i.R1`
System::Call `user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 0, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})`
System::Call `user32::LoadImage(i 0, t "$PLUGINSDIR\vinni.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $hBitmap
SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $hBitmap
FunctionEnd

; Free loaded resources.
Function .onGUIEnd
; Destroy the bitmap.
System::Call `gdi32::DeleteObject(i s)` $hBitmap
FunctionEnd

Section
Sleep 500
SectionEnd


http://s017.radikal.ru/i421/1412/c4/4c0ca23fecd1.jpg

Painkiller
19-12-2014, 14:18
Народ , в чем может быть проблема кода :

${If} ${KeyExists} "${HKLM}\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}"
DetailPrint '[Присутствует] KB2881071 '
${Else}
DetailPrint '[не Установлено] KB2881071'
${EndIf}

Ключ не существует , а код говорит обратное =((
Ось 7 x64

MKN
19-12-2014, 16:10
Painkiller,

Что это у тебя за синтаксис ?...

попробуй такие варианты :

ClearErrors
ReadRegStr $0 HKLM "SOFTWARE\App" ""
${If} ${Errors}
# ключ не существует
${EndIf}


или


ClearErrors
EnumRegKey $ 0 HKCR "SOFTWARE\App" 0
IfErrors 0 keyexist
# ключ не существует
keyexist:

Painkiller
19-12-2014, 17:51
Что это у тебя за синтаксис ?... »
Взял из справочника , использую плагин RegistryFunc
попробуй такие варианты : »

MKN, попробовал твой пример, теперь ключ не существует, не зависимо от того, есть он или нету =((

ClearErrors
ReadRegStr $0 HKLM "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{8BEEA2FC-D416-428A-B52A-A3ED45921151}" ""
${If} ${Errors}

DetailPrint '[не Установлено] KB2553140'
${Else}
DetailPrint '[Установлено] KB2553140'

${EndIf}

Нашёл рабочее решение :


!include "Registry.nsh"
.....

; ----- KB2881071 -----------
${registry::KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}" $9
StrCmp $9 0 0 +2
DetailPrint '[Присутствует] KB2881071'
StrCmp $9 -1 0 +2
DetailPrint '[нету] KB2881071'
SectionEnd


Но мне нужно засунь определенные действия в каждый из случаев . ${If} ${Else}${EndIf} не прокатывают =((

MKN
20-12-2014, 10:25
Painkiller,
Конечно не работает, ведь ReadRegStr читает не сам ключ, а его значение (а оно у тебя пусто, или по факту какое то есть ? Если есть, то вполне можно "привязаться" к нему)
Если значения нет, используй EnumRegKey, с ним работает :

ClearErrors
EnumRegKey $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}" 0
IfErrors 0 keyexist
MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации."
keyexist:
MessageBox MB_OK "Дальнейший код"

K.A.V.
20-12-2014, 10:40
Но мне нужно засунь определенные действия в каждый из случаев . ${If} ${Else}${EndIf} не прокатывают =(( »


${registry::KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}" $9
${If} $9 == 0
MessageBox MB_OK|MB_ICONINFORMATION "[Присутствует] KB2881071"
${Else}
MessageBox MB_OK|MB_ICONINFORMATION "нету KB2881071"
${EndIf}

Painkiller
20-12-2014, 17:04
Радовался что все получилось , да вот зря=(( Не все ключ правильно определяет (((

MKN
23-12-2014, 13:32
Не все ключ правильно определяет »
В смысле ? Нужно определить не просто наличие ключа, а конкретно его название ?
Тогда можно так :

${Do}
EnumRegKey $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" $0 # перечисляются все разделы в ветке Uninstall
IntOp $0 $0 + 1
StrCpy $2 $1
${If} $2 == "{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}"
ClearErrors
MessageBox MB_OK "$1"
${EndIf}
${LoopUntil} $1 == ""

Painkiller
23-12-2014, 14:45
MKN, мне нужен код чтобы при наличии ключа выполнял какие-то действия и при его отсутствии тоже выполнял определенные действия ?? Как изменить код , который вы мне оставили для моих нужд ?

MKN
23-12-2014, 15:06
Painkiller, мне нужен код чтобы при наличии ключа выполнял какие-то действия и при его отсутствии тоже выполнял определенные действия ? »
Так пример же дан. :

MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации."
keyexist:
MessageBox MB_OK "Дальнейший код"

Вместо "MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации." - пишешь свой код , когда ключа нет.




© OSzone.net 2001-2012