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

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Ответить
Настройки темы
.: NSIS - все вопросы :. часть 2.

Аватара для kotkovets

Ветеран


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


Конфигурация

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


Изменения
Автор: kotkovets
Дата: 07-06-2020
Описание: NSIS 3.05


Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения.


Описание:
читать дальше »
NSIS (Nullsoft Scriptable Install System) - профессиональная система для создания инсталляторов в среде Windows с октрытым исходным кодом. При своем малом размере система очень гибкая, и при с широкими возможностями. Генерируемый ею инсталлятор также имеет очень маленький размер и идеально подходит для распространения продукта через Интернет.


Текущая версия: NSIS 3.05 от 15 декабря 2019 года
Скачать | Архив сборок версии

Первая часть этой темы
Скачать первую часть этой темы одним архивом

ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества.
Руководство пользователя. Перевод – Поляков А.В, зеркало

Документация

Утилиты разработчика
Расширение функциональности

Примеры скриптов на нашем форуме
Скрипт NSIS для перепаковки AIMP2+Сборки
Тема для Notepad++(пример парсинга XML)

Достоинства
читать дальше »


◦ Очень маленький размер установочного блока (около 34 Кбайт)
◦ zlib, bzip2 и LZMA-сжатие
◦ Гибкая система скриптов (спецально разработанная для инсталляторов)
◦ Поддержка многоязычности, точнее 53 языка, есть возможность ввода нового языка
◦ Поддержка плагинов
◦ Скрипт Препроцессор
◦ Создание Web-инсталляторов


Ещё немного полезной информации:
читать дальше »

▫ История создания установщика

NSIS создан как альтернатива InstallShield, предназначенного для коммерческих продуктов.

NSIS был создан для распространения Winamp. Он базируется на предыдущем продукте Nullsoft — PiMP (plugin Mini Packager), иначе известным как SuperPiMP. После версии 2.0a0, проект был перемещён на SourceForge.net, где к работе над ним присоединились и сторонние разработчики. NSIS 2.0 был выпущен в свет 2 года спустя.

NSIS версии 1 был очень похож на классический Windows Installer, но он был более управлемым с помощью скриптов и поддерживал другие форматы сжатия. NSIS версии 2 поддерживает новый графический интерфейс пользователя, LZMA-сжатие, многоязычность и имеет хорошую систему плагинов.

Версия 2.01 была первой версией, поддерживающей компиляцию на любой из POSIX-платформ. Это позволило создавать Windows-инсталляторы на GNU/Linux и FreeBSD без использования эмулятора Wine. На данный момент поддерживается компиляция только для Windows.

▫ Описание

Компилятор NSIS — программа makensis — компилирует скрипты в исполняемый код. Каждая строчка скрипта содержит одну команду. Пример:
Код: Выделить весь код
 # Пример скрипта
 Name "Example1"
 OutFile "example1.exe"
 InstallDir "$PROGRAMFILES\Example1"
 Page Directory
 Page InstFiles
 Section
   SetOutPath $INSTDIR
   File ..\makensis.exe
 SectionEnd

Modern User Interface

В версии 2.0 был введён новый графический интерфейс пользователя, названный Modern UI (MUI). MUI очень похож на интерфейс мастеров, он поддерживает splash screen, выбора языка, выбор компонентов для установки и более широкие возможности настройки по сравнению со своим предшественником. Пример:
Код: Выделить весь код
 # Пример скрипта с Modern UI
 !include MUI.nsh
 Name "Example 2"
 OutFile Example2.exe
 !insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "license.rtf"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_LANGUAGE "German"
 !insertmacro MUI_LANGUAGE "French"
 Section "Extract makensis"
  SetOutPath $INSTDIR
  File ..\makensis.exe
 SectionEnd
NSIS может быть расширен при помощи плагинов, которые могут быть написаны на C++, Си, и Delphi. Плагины могут быть использованы для улучшения функциональности и интерфейса инсталлятора. Плагины могут быть вызваны в любой части кода NSIS скрипта.

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

▫ Программы, использующие NSIS


◦ Антивирус Касперского
◦ Qip
◦ 3DNA Desktop
◦ 7-Zip
◦ ATI Display Driver
◦ CDex
◦ Dev-C++
◦ DivX
◦ eMule FileZilla
◦ Google Picasa
◦ Google Talk
◦ Intel C (компилятор)
◦ IrfanView
◦ LightAllow
◦ LyX
◦ Miranda IM Mozilla Firefox 2.0
◦ NASA World Wind
◦ Notepad++
◦ OpenOffice.org для Windows
◦ Pidgin
◦ VLC Player
◦ Winamp

▫ Чем я могу распаковать инсталлятор, созданный в NSIS?

В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции.


-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.

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

Отправлено: 12:02, 09-12-2012

 

Аватара для Flix

Пользователь


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

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


Цитата Kopejkin:
Страниц 50 назад MKN уже давал архив с этим "гардеробом" »
Да что вы прицепились к версиям DLL. Я к примеру искал юникодную версию данной библиотеки, т.к. использую юникодные версии NSIS/Inno Setup. Нашел у китайцев и выложил сюда, сам я ничего не выдумал. Товарищ MKN нашел одну, я нашел другую. По функционалу они обе одинаковы, разные размеры файлов говорят о том, что наверное ломались разными людьми, но что вам использовать решайте сами.

Цитата Kopejkin:
Можно ли отключить для этих элементов шрифтовые эффекты-дефекты? »
Мое мнение: Эти все так называемые "дефекты" являются результатом настроек персонализации Рабочего стола Windows (выбранная тема оформления, параметры ClearType и прочие настройки персонализации). Например, отключите у себя опцию ClearType (сглаживание текста) и указанного вами бага не будет.


Поэтому с такими "дефектами" приходится мириться или применять стили, где они не так явно проявляются. Возможно все же есть какое-то другое решение, но я его не знаю.

Цитата Kopejkin:
Все равно, для нормальной работы требуется skinh.she. »
То есть вы указали путь к другому файла стиля и он не загрузился? А как же тогда работает обозреватель стилей? Там же выбирается конкретный файл (с другим именем) и он успешно загружается. Может вы допустили ошибку в параметрах функции SkinH_AttachEx?

Отправлено: 16:30, 26-02-2014 | #1051



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


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

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


Цитата Kopejkin:
Во всем этом "мёде" есть ложечка дегтя - на всех "темных" темах некрасиво отображается шрифт с "тенью" или "выдавленный" (бренд, описание компонентов).
Это касается не только шкурок SkinSharp. Такой же эффект был и со шкурками ISSkin. »
Цитата Flix:
Мое мнение: Эти все так называемые "дефекты" являются результатом настроек персонализации Рабочего стола Windows »
Данным элементам присвоен стиль "WS_DISABLED", возможно из-за этого получаются глюки при отображении текста данных элементов, попробуйте добавить функцию удаления стиля и назначения своего цвета тексту (серый и красный на выбор в моём примере)
*В примере идёт удаление стиля у надписи "Nullsoft Scriptable Install System"

Код: Выделить весь код
!include "mui.nsh"
!include "nsDialogs.nsh"

!define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call"
!macro _NSD_RemoveStyle_Call CONTROL EXSTYLE
  Push `${CONTROL}`
  Push `${EXSTYLE}`
  System::Store SR1R0
  IntOp $R1 $R1 ~
  System::Call `user32::GetWindowLong(iR0,i${GWL_STYLE})i.R2`
  IntOp $R2 $R1 & $R2
  System::Call `user32::SetWindowLong(iR0,i${GWL_STYLE},iR2)`
  System::Store L
!macroend


!insertmacro MUI_PAGE_WELCOME

!define MUI_PAGE_CUSTOMFUNCTION_PRE RemoveDISABLEDStyle

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
Функция
Код: Выделить весь код
Function RemoveDISABLEDStyle
  GetDlgItem $0 $HWNDPARENT 1028
  ${NSD_RemoveStyle} $0 0x08000000L
;  SetCtlColors $0 "0xFF0000" transparent ; Красныйй цвет текста
  SetCtlColors $0 "0x808080" transparent ; Серый цвет текста
FunctionEnd

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]

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

Отправлено: 17:01, 26-02-2014 | #1052


Аватара для Flix

Пользователь


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

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


Цитата Flix:
Чтобы не переименовывать файл стиля, нужно использовать функцию SkinH_AttachEx (данное утверждение нуждается в проверке). »
Только что проверил - работает. Вот как выглядит код:
Код: Выделить весь код
Function onGUIInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "${NSISDIR}\Plugins\x86-unicode\SkinH.dll"
  File "${NSISDIR}\Contrib\Skins\0011.she"

  ; При помощи функции SkinH_AttachEx загружаем файл стиля с именем 0011.she
  System::Call SkinH::SkinH_AttachEx(t'$PLUGINSDIR\0011.she')
 
#################### Patches for SkinSharp ####################
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
  IntOp $0 $0 + 0x0002CA98
  System::Call Kernel32::GetCurrentProcess()i.s
  System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
  System::Call "*$0(&i1 0)"
###############################################################
FunctionEnd
Пути к файлам у вас конечно же могут быть другие. Я использую Unicode, поэтому и DLL юникодный. Таким образом можно не переименовывать файлы стилей.

Цитата K.A.V.:
Данным элементам присвоен стиль "WS_DISABLED", возможно из-за этого получаются глюки при отображении текста данных элементов »
Да, точно, и это тоже оказывается имеет значение, вы правы. Если элемент не использует стиль WS_DISABLED, то текст отображается нормально.

Последний раз редактировалось Flix, 26-02-2014 в 18:39.

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

Отправлено: 18:34, 26-02-2014 | #1053


Пользователь


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

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


K.A.V., Приятно послушать разговор знающих людей. Особенно когда тема беседы понятна.
Т.к. это не про меня, буду вставлять умные слова в свои вопросы "хотелки".
Какой дескриптор у текста "Position your mouse over a component to see its description" и ... В общем, как у этого текста удалить стиль?
Домашняя работа.
При использовании скинов SkinSharp ваш способ не окрашивает текст в красный (серый), а дает возможность отображаться тексту "Nullsoft Install System"цветом других текстов скина. В окнах обычного инсталлятора (без скинов) текст окрашивается.
Для правильной работы команду "!define MUI_PAGE_CUSTOMFUNCTION_PRE RemoveDISABLEDStyle" понадобилось установить перед страницей приветствия.

Нашел я, все-таки, где цвет фона окна меняется в VCL Styles for NSIS. Странно, что долго искал
читать дальше »




Здесь можно поменять цвет текста.




А здесь цвет фона и других элементов окон.

Последний раз редактировалось Kopejkin, 01-03-2014 в 12:44.


Отправлено: 23:34, 26-02-2014 | #1054


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


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

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


Цитата Kopejkin:
Какой дескриптор у текста "Position your mouse over a component to see its description" »
Переходим в папку \NSIS\Contrib\UIs и открываем modern.exe программой для просмотра ресурсов (ResHacker, Restorator и т.д.)
Ищем диалог, в котором располагается искомый элемент, в нашем случае это диалог 104 - выбор компонентов
Ищем нужный нам элемент и смотрим его ID - 1043

Теперь, чтобы выполнить взаимодействие с данным элементом при работе графического интерфейса инсталлятора (убрать/присвоить стиль, поменять текст/цвет и т.д.) - нам нужно узнать его дескриптор, дескриптор своего рода уникальный идентификатор каждого элемента в графическом интерфейсе любой программы, надеюсь, понятно объяснил, если что - гугл

Чтобы узнать этот самый дескриптор, нам нужно знать ID элемента, который прописан в UI файле (мы уже узнали, это 1043)
Но т.к. наш элемент находится в дочернем окне графического интерфейса ("внутри основного", посмотрите диалоги в ресурсах и всё поймёте), нам нужно сделать немножко другие манипуляции.
Теперь в коде выполняем команду:
Код: Выделить весь код
  GetDlgItem $0 $HWNDPARENT 1043
$0 - переменная, куда будет поммещен дескриптор элемента с ID 1043
$HWNDPARENT - дескриптор окна инсталлятора
1043 - соответственно, ID элемента, дескрпитор которого нам нужно узнать
Это пример получения дескриптора элемента по идентификатору в ресурсах диалога

Чтобы удалить стиль конкретно обсуждаемый "WS_DISABLED", нужно выполнить команду:
Код: Выделить весь код
 ${NSD_RemoveStyle} $0 0x08000000L
где $0 - дескриптор элемента, у которого удаляем стиль
0x08000000L - даёт понять команде, какой стиль удалять, в нашем случае это "WS_DISABLED"

Цитата Kopejkin:
При использовании скинов SkinSharp ваш способ не окрашивает текст в красный (серый), а дает возможность отображаться тексту "Nullsoft Install System"цветом других текстов скина. В окнах обычного инсталлятора (без скинов) текст окрашивается. »
И не удивительно, ведь "скин сам решает" и устанавливает свои цвета, точно также реализовано и в "NSIS SkinCrafter" плагине, при его использовании нельзя установить цвета на текст, для этого и были созданы скины...

Теперь о проблеме...Посидел, посмотрел, выводы такие:
Если вы хотите изменить цвет текста описания компонентов, то вы должны указать и цвет фона для этого текста, иначе получите глюки при отображении описаний (возможно, решаемо, но не хочу копаться )
Если цвет текста изменять не надо - будет дефолтный цвет (черный по-умолчанию, ну, в зависимости от настроек темы оформления и т.д.)
Т.к. речь идёт о кастомизации интерфейса, то делаю вывод, что цвет текста всё-таки менять нужно, иначе получится не очень привлекательно

реализовать можно так:
1. Если нужно просто убрать стиль на элемент описания, то воспользуйтесь примером из пункта 3, удалив те участки кода в моих примерах, которые выделены жирным шрифтом

Сдеюущие примеры для того, чтобы убрать стиль и назначить цвет текста и фона элементу описания секций
2. Не красиво, нужно редактировать главный файл настроек интерфейса MUI, но удобно назначать описания секциям, не внося никаких изменений в главный файл скрипта вашего инсталлятора
Можно, например, просто скопировать указанный ниже файл и в ту же папку и изменить его имя, и за место
Код: Выделить весь код
!include "mui.nsh"
прописать
Код: Выделить весь код
!include "C:\Program Files\NSIS\Contrib\Modern UI\My_System.nsh"
Открываем файл: \NSIS\Contrib\Modern UI\System.nsh
Ищем
читать дальше »
Код: Выделить весь код
!macro MUI_DESCRIPTION_BEGIN

  FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
  GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043

  StrCmp $0 -1 0 mui.description_begin_done
    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:"
    EnableWindow $MUI_TEMP1 0
    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$MUI_TEXT"
    Goto mui.description_done
  mui.description_begin_done:

!macroend

Закомменитруем строку EnableWindow $MUI_TEMP1 0, которая делает элемент с текстом описания неактивным
читать дальше »
Код: Выделить весь код
!macro MUI_DESCRIPTION_BEGIN

  FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
  GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043

  StrCmp $0 -1 0 mui.description_begin_done
    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:"
;    EnableWindow $MUI_TEMP1 0
    SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$MUI_TEXT"
    Goto mui.description_done
  mui.description_begin_done:

!macroend


Ищем:
читать дальше »
Код: Выделить весь код
  Function "${SHOW}"

    !insertmacro MUI_INNERDIALOG_TEXT 1042 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}"

    FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
    GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043
    EnableWindow $MUI_TEMP1 0

    !insertmacro MUI_INNERDIALOG_TEXT 1043 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
    StrCpy $MUI_TEXT "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW

  FunctionEnd


Меняем на:
читать дальше »
Код: Выделить весь код
  Function "${SHOW}"

    !insertmacro MUI_INNERDIALOG_TEXT 1042 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}"

    FindWindow $MUI_TEMP2 "#32770" "" $HWNDPARENT
    GetDlgItem $MUI_TEMP1 $MUI_TEMP2 1043
    SetCtlColors $MUI_TEMP1 "0xFF0000"  "0xFFFFFF" ; Элемент текста описания, Красныйй цвет текста на белом фоне

    GetDlgItem $MUI_TEMP1 $MUI_TEMP2 1042
    SetCtlColors $MUI_TEMP1 ""  "0xFFFFFF" ; Ставим белый фон на слово "Описание", элемент рамки, цвет текста не меняется

    !insertmacro MUI_INNERDIALOG_TEXT 1043 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
    StrCpy $MUI_TEXT "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
    !insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW

  FunctionEnd


3. Второй способ. Изменения вносятся только в ваш скрипт инсталлятора. Из плюсов - не нужно редактировать главный файл настроек MUI интерфейса. Минусы - нужно будет писать собственную функцию обработки показа описаний и нужно назначать описания секциям по порядковым номерам начиная с 0, т.е. в том порядке, в каком они прописаны в вашем скрипте.
Для начала
читать дальше »
Код: Выделить весь код
!insertmacro MUI_PAGE_WELCOME

!define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES


Функция
читать дальше »
Код: Выделить весь код
Function RemoveDISABLEDStyle_Description
FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $1 $0 1043
  ${NSD_RemoveStyle} $1 0x08000000L
  SetCtlColors $1 "0xFF0000"  "0xFFFFFF" ; Красныйй цвет текста на белом фоне
  GetDlgItem $1 $0 1042
  SetCtlColors $1 ""  "0xFFFFFF" ; Ставим белый фон на слово "Описание", элемент рамки, цвет текста не меняется
FunctionEnd


Пример двух секций с присвоением им описаний + функция для обработки показа описаний
читать дальше »
Код: Выделить весь код
Section "Первая секция"
SectionEnd

Section "Вторая секция"
SectionEnd


Function .onMouseOverSection
    FindWindow $R0 "#32770" "" $HWNDPARENT
    GetDlgItem $R0 $R0 1043

    StrCmp $0 -1 "" +2
    SendMessage $R0 ${WM_SETTEXT} 0 "STR:$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)" ; текст "Наведите курсор мыши на название компонента, чтобы прочесть его описание." в зависимости от языка графического интерфейса

    StrCmp $0 0 "" +2
      SendMessage $R0 ${WM_SETTEXT} 0 "STR:Описание первой секции"

    StrCmp $0 1 "" +2
      SendMessage $R0 ${WM_SETTEXT} 0 "STR:Описание второй секции"
FunctionEnd


При использовании второго метода не забудьте удалить старые строки описаний компонентов, типа таких:
читать дальше »
Код: Выделить весь код
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END


вроде ничего не забыл

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]


Последний раз редактировалось K.A.V., 27-02-2014 в 01:42.

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

Отправлено: 01:17, 27-02-2014 | #1055


Пользователь


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

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


Цитата K.A.V:
0x08000000L - даёт понять команде, какой стиль удалять, в нашем случае это "WS_DISABLED.»
Это, по образу и подобию, я скопипастил в первую очередь
читать дальше »

PHP код: Выделить весь код

Function RemoveDISABLEDStyle
  
  GetDlgItem 
$0 $HWNDPARENT 1028
  
${NSD_RemoveStyle} $0 0x08000000L
  SetCtlColors 
$"0xFF0000" transparent Красный цвет текста

  GetDlgItem 
$1 $HWNDPARENT 1043
  
${NSD_RemoveStyle} $1 0x08000000L
  SetCtlColors 
$"0xFF0000" transparent Красный цвет текста

FunctionEnd 

Только для текста "Position your mouse over a component to see its description" этот вариант не прошел.
У элемента 1043 не оказалось параметра "WS_DISABLED". Там стоит "WS_VISIBLE". Поэтому и спросил.



Способ номер 2 не работает - ничего нигде не перекрашивается и стиль не удаляется.

Вот код, на котором испытывался способ 2.
(Скрипт с ошибками, поэтому и неправильно работает)

читать дальше »
PHP код: Выделить весь код

/*
ВНИМАНИЕ! СКРИПТ С ОШИБКАМИ.

Hide Style.nsi
Скрываем стили текстов и красим их
Совет от K.A.V.
*/

  
!include "MUI2.nsh"
  
;!include "nsDialogs.nsh" нужно-не нужноЧто с нимчто без него.
  !
addplugindir "..\..\Win32\Release" 

;--------------------------------

;
General
  Name 
"Hide Style"
  
OutFile "Hide_Style.exe"
;Default installation folder
  InstallDir 
"$TEMP"
;Request application privileges for Windows Vista
  RequestExecutionLevel user

;--------------------------------
  ; 
макрос удаления стиля текста (K.A.V.)
  !
define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call"
   
!macro _NSD_RemoveStyle_Call CONTROL EXSTYLE
        Push 
`${CONTROL}`
        
Push `${EXSTYLE}`
        
System::Store SR1R0
        IntOp $R1 $R1 
~
        
System::Call `user32::GetWindowLong(iR0,i${GWL_STYLE})i.R2`
        
IntOp $R2 $R1 $R2
        System
::Call `user32::SetWindowLong(iR0,i${GWL_STYLE},iR2)`
        
System::Store L
   
!macroend
   
  
!define MUI_ABORTWARNING

;--------------------------------
  !
define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description Команда отключения стиля текста
  
;!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit Команда использования скина
  
  
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
  
!insertmacro MUI_PAGE_COMPONENTS
  
!insertmacro MUI_PAGE_DIRECTORY
  
!insertmacro MUI_PAGE_INSTFILES
  
  
!insertmacro MUI_UNPAGE_CONFIRM
  
!insertmacro MUI_UNPAGE_INSTFILES
  
;--------------------------------
;
Languages
 
  
!insertmacro MUI_LANGUAGE "English"

;--------------------------------

Section "Первая секция"
SectionEnd

Section 
"Вторая секция"
SectionEnd


Function .onMouseOverSection
    FindWindow $R0 
"#32770" "" $HWNDPARENT
    GetDlgItem $R0 $R0 1043

    StrCmp 
$-"" +2
    SendMessage $R0 
${WM_SETTEXT"STR:$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)" текст "Наведите курсор мыши на название компонента, чтобы прочесть его описание." в зависимости от языка графического интерфейса

    StrCmp 
$0 0 "" +2
      SendMessage $R0 
${WM_SETTEXT"STR:Описание первой секции"

    
StrCmp $0 1 "" +2
      SendMessage $R0 
${WM_SETTEXT"STR:Описание второй секции"
FunctionEnd


;РАБОТАЮЩАЯ функция (для текста "Nullsoft Install System")

Function 
RemoveDISABLEDStyle_Description
  GetDlgItem 
$0 $HWNDPARENT 1028
  
${NSD_RemoveStyle} $0 0x08000000L
  SetCtlColors 
$"0xFF0000" transparent Красный цвет текста
  
;SetCtlColors $"0x808080" transparent Серый цвет текста
FunctionEnd

/*
; НЕ РАБОТАЮЩАЯ функция (для текста описания "Position your mouse over a component to see its description"

Function RemoveDISABLEDStyle_Description
FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $1 $0 1043
  ${NSD_RemoveStyle} $1 0x08000000L
  SetCtlColors $1 "0xFF0000"  "0xFFFFFF" ; Красный цвет текста на белом фоне
  GetDlgItem $1 $0 1042
  SetCtlColors $1 ""  "0xFFFFFF" ; Ставим белый фон на слово "Описание", элемент рамки, цвет текста не меняется
FunctionEnd

; Использование скинов SkinH (совет от Flix)
Function onGUIInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "D:\NSIS\SkinSharp\DLL\ANSI\SkinH.dll"
  File "D:\NSIS\SkinSharp\Skins\0012.she"
 ; При помощи функции SkinH_AttachEx загружаем файл стиля с именем 0011.she

  System::Call SkinH::SkinH_AttachEx(t'$PLUGINSDIR\0012.she')
  System::Call SkinH::SkinH_AdjustHSV(i-20,i,i) ; здесь можно красить скин

  ; Patches for SkinSharp 
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
  IntOp $0 $0 + 0x0002CA98
  System::Call Kernel32::GetCurrentProcess()i.s
  System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
  System::Call "*$0(&i1 0)"
  
FunctionEnd

Function .onGUIEnd
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
  System::Call Kernel32::FreeLibrary(is)
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd
*/ 



Снимки с использованием скина SkinH и без него:



Функция работает



Функция не работает

Может я накосячил чего?
Сам добавил позднее:
Накосячил 100 %.


Со способом номер 1 еще не разбирался.

Последний раз редактировалось Kopejkin, 01-03-2014 в 12:43.


Отправлено: 13:56, 27-02-2014 | #1056


Аватара для Flix

Пользователь


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

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


Если необходимо просто избавиться от дефекта, появляющегося на элементах с текстом фирмы и описания компонентов при использовании некоторых стилей SkinSharp, то вариант, предложенный K.A.V. можно намного упростить. Как мы уже выяснили ранее, данный дефект проявляется на элементах, у которых имеется свойство WS_DISABLED, т.е. говоря простым язык - элемент отключен.



Чтобы избавиться от дефекта, данные элементы необходимо включить, и тогда текст примет свойства заданные самой темой.

Включаем элемент с текстом фирмы (брандинг). В функции onGUIInit, перед командой применением стиля, указываем следующие команды:

Код: Выделить весь код
  ; Получаем дескриптор элемента управления с надписью бренда
  GetDlgItem $0 $HWNDPARENT 1028
  ; Включаем элемент управления (1- включить, 0- отключить)
  EnableWindow $0 1
Включаем элемент с описанием компонентов установки. Здесь необходимо добавить две функции перед страницей с выбором компонентов. Первая функция включит элемент при отображении диалога, а вторая будет включать элемент каждый раз при наведении курсора мышки на компоненты установки. Итак, указываем функции:

Код: Выделить весь код
  ; Функция включения элемента с описанием компонентов
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
  ; Функция включения элемента с описанием компонентов при наведении курсора мышки
  !define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyleOnSel

  !insertmacro MUI_PAGE_COMPONENTS
А теперь код самих функций:

Код: Выделить весь код
# Функция включения стиля для элемента с описанием компонентов
Function ENABLEDStyle
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления 
  EnableWindow $1 1
FunctionEnd

# Функция включения стиля для элемента с описанием компонентов
# при наведении курсора мышки на компоненты установки
Function ENABLEDStyleOnSel
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления 
  EnableWindow $1 1
FunctionEnd
При этом строки с описанием компонентов можно оставить без изменений:

Код: Выделить весь код
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END
Вот и все, при работе инсталлятора, например с темой 0011.she, указанного выше дефекта мы больше наблюдать не будем:



Полный код сценария (используется NSIS v3.0a2):
Код: Выделить весь код
# Поддержка Unicode
Unicode true

!include MUI.nsh
!include nsDialogs.nsh

!define PRODUCT_NAME "My application"
SetCompressor lzma
BrandingText "Nullsoft Scriptable Install System"

 
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
 
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "License.txt"

; Функция включения элемента с описанием компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
; Функция включения элемента с описанием компонентов при наведении курсора мышки
!define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyleOnSel

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
 
!insertmacro MUI_LANGUAGE "Russian"
 
Name "SkinH"
OutFile "setup_SkinH.exe"
InstallDir "$PROGRAMFILES\My application"
 
Section "Секция 1" SEC1
SectionEnd

Section "Секция 2" SEC2
SectionEnd

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END
 
Function onGUIInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "${NSISDIR}\Plugins\x86-unicode\SkinH.dll"
  File "${NSISDIR}\Contrib\Skins\0011.she"
  
  ; Получаем дескриптор элемента управления с надписью бренда
  GetDlgItem $0 $HWNDPARENT 1028
  ; Включаем элемент управления (1- включить, 0- отключить)
  EnableWindow $0 1

  ; При помощи функции SkinH_AttachEx загружаем файл стиля с именем 0011.she
  System::Call SkinH::SkinH_AttachEx(t'$PLUGINSDIR\0011.she')
 
#################### Patches for SkinSharp ####################
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
  IntOp $0 $0 + 0x0002CA98
  System::Call Kernel32::GetCurrentProcess()i.s
  System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
  System::Call "*$0(&i1 0)"
###############################################################
FunctionEnd

# Функция включения стиля для элемента с описанием компонентов
Function ENABLEDStyle
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления 
  EnableWindow $1 1
FunctionEnd

# Функция включения стиля для элемента с описанием компонентов
# при наведении курсора мышки на компоненты установки
Function ENABLEDStyleOnSel
  ; Выполняем поиск окна инсталлятора
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления 
  EnableWindow $1 1
FunctionEnd

Function .onGUIEnd
  ; Удаление временной папки
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
  System::Call Kernel32::FreeLibrary(is)
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:27, 27-02-2014 | #1057


Пользователь


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

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


Flix, подскажите, пожалуйста, правильный синтаксис написания параметров для функции SkinH_AttachExt. Я так понимаю, что тогда не нужно будет прописывать отдельную функцию настройки оттенка, насыщенности и яркости SkinH_AdjustHSV. Желательно, пример в вашем же скрипте.

Отправлено: 14:53, 27-02-2014 | #1058


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


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

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


Цитата Kopejkin:
Способ номер 3 не работает - ничего нигде не перекрашивается и стиль не удаляется. »
Да ладно вам, внимательно нужно смотреть, инклудить всё, что я предлагаю и прописывать команды в том порядке, в котором прописаны у меня. Думаете я просто так написал вам неработающий код в нескольких вариантах в 4 утра по своему времени?

Нужно
Код: Выделить весь код
 !include "nsDialogs.nsh"
Неправильно
Код: Выделить весь код
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description ; Команда отключения стиля текста
  !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"

  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
Правильно
Код: Выделить весь код
 
  !insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
 !define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description ; Команда отключения стиля текста
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
Цитата Kopejkin:
Только для текста "Position your mouse over a component to see its description" этот вариант не прошел.
У элемента 1043 не оказалось параметра "WS_DISABLED". Там стоит "WS_VISIBLE". Поэтому и спросил. »
Всё дело в том, что данный элемент становится неактивным в момент наведения мышки на секции при работе инсталлятора

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]


Отправлено: 15:18, 27-02-2014 | #1059


Аватара для Flix

Пользователь


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

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


Цитата Kopejkin:
подскажите, пожалуйста, правильный синтаксис написания параметров для функции SkinH_AttachExt »
Да все очень просто. Меняете команду:

Код: Выделить весь код
  ; При помощи функции SkinH_AttachEx загружаем файл стиля с именем 0011.she
  System::Call SkinH::SkinH_AttachEx(t'$PLUGINSDIR\0011.she')
На команду:

Код: Выделить весь код
  ; При помощи функции SkinH_AttachExt загружаем файл стиля с именем 0012.she
  ; и указываем для него желаемые параметры (можно подобрать с помощью SkinViewer):
  ;  - Оттенок = 155
  ;  - Насыщенность = -32
  ;  - Яркость = -12
  ; Примечание: т.к. пароль для выбранного стиля не задан, то в параметрах
  ;             функции оставляем пустое значение (,,), т.е. для этого 
  ;             параметра (strPassword) функция получит значение null.
  System::Call SkinH::SkinH_AttachExt(t'$PLUGINSDIR\0012.she',,i155,i-32,i-12)
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:32, 27-02-2014 | #1060



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 dimadr Наборы обновлений для Windows XP/2003/Windows 7 267 14-02-2020 08:25
[архив].: NSIS - все вопросы :. kotkovets Автоматическая установка приложений 3387 09-12-2012 11:56
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 jameszero Наборы обновлений для Windows XP/2003/Windows 7 1491 22-07-2011 22:42
Выбор|модернизация процессора .:[все вопросы]:. Часть I Myxa Выбор отдельных компонентов компьютера и конфигурации в целом 1845 01-01-2011 19:18
Вопросы по создателю инсталляций NSIS MaxDELETE Программное обеспечение Windows 14 04-07-2007 10:01




 
Переход