Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Озадачился вроде как простым вопросом - как на кастомной странице изменить цвет текста в поле чекбокса ? ... Или я что то не так делаю ?»
Самый простой вариант - это отключить в сценарии поддержку стилей ХР: XPStyle off
Тогда для чекбокса сможете указывать командой SetCtlColors какой угодно цвет текста. :)
Доброго времени суток! Подскажите,пожалуйста,почему в "Установке и удалении программ" (xp) или в "Программах и компонентах " (7) не отображается размер установленной программы? Имя,сайт,комментарий и т.д всё отображается,а размер нет.Просто пустое поле.Что нужно сделать?
Доброго времени суток! Подскажите,пожалуйста,почему в "Установке и удалении программ" (xp) или в "Программах и компонентах " (7) не отображается размер установленной программы? Имя,сайт,комментарий и т.д всё отображается,а размер нет.Просто пустое поле »
По моим личным наблюдениям, в Windows XP необходимо наличие REG_SZ параметра "InstallLocation" в ветке Uninstall с правильным путём к директории с программой, тогда апплет будет отображать размер установленной программы.
Если после изменения информации в существующем пункте нет эффекта, удалите раздел
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Management\ARPCache\Имя_Раздела_в_Uninstall
где Имя_Раздела_в_Uninstall, имя вашего раздела в
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Однако на Win7 почему-то не подхватывается данный параметр, поэтому для Windows 7 и выше помогает создание REG_DWORD параметра с именем EstimatedSize, значение данному параметру необходимо установить как размер установленной программы в килобайтах, например:
WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Имя_Раздела_в_Uninstall" "EstimatedSize" "900000"
где 900000 - размер программы в килобайтах
Спасибо! Помогло! Теперь в и ХР и в 7 размер отображается корректно!
Скажите,а можно в элементе "text" разрешить ввод только латинских символов? Я знаю,есть флаг "OnlyNumbers",а нужно,чтобы можно было писать цифрами и английскими буквами.
Скажите,а можно в элементе "text" разрешить ввод только латинских символов? »
Можно написать код проверки с использованием команды StrFilter (описание есть в справочнике)
Если бы все подробно читали описание команд и знали их возможности, то таких бы вопросов не возникало :(
${StrFilter} "Артем 123 TEST" "2rus" "" "" $0
StrCmp $0 "" +3 0
MessageBox MB_OK|MB_ICONSTOP "'$0'$\nЕсть русские буквы"
abort
Артем 123 TEST
Строка, которую проверяем на наличие русских букв
2rus
Указываем команде, что нужно оставить только русские буквы в строке, если они есть, то в переменную $0 будут помещены только русские буквы, так мы проверим, есть ли в строке русские буквы
$0
Переменная, в которую поместятся русские буквы, если они есть в строке
После этого командой StrCmp (описание опять же, есть в справочнике) проверяем значение переменной, если в переменной пусто - русских символов нет в строке
Ох спасибо огромное! Всё здорово работает! :up Русские буквы вычисляет как надо! :)
отключить в сценарии поддержку стилей ХР: XPStyle off »
Действительно, так цвет текста работает, но только в классическом случае... А у меня фоном кастомной страницы - bmp изображение и этот номер не проходит...
При установке для фона текста - transparent - фон устанавливается стандартного цвета... Что можно сделать ?
Также интересует вопрос - как перетаскивать окно без заголовка ( с использованием плагина MoveAnywhere.dll ), если фон страницы - bmp изображение ? С таким фоном перетаскивание не работает...
4eshireCat
17-06-2014, 12:46
Также интересует вопрос - как перетаскивать окно без заголовка ( с использованием плагина MoveAnywhere.dll ), если фон страницы - bmp изображение ? »
Вот накидал кое-что, попробуй (см. прикрепленный архив)
PS Закрытие окна Alt+F4
4eshireCat,
Фон у меня почему то отсутствует. И перетаскивается только это :
http://i038.radikal.ru/1406/e9/ed9b9c7046b2.jpg
ps разобрался, надо так :
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s'
А без interface.exe никак нельзя обойтись ?
4eshireCat
17-06-2014, 13:08
А без interface.exe никак нельзя обойтись ? »
Обойтись можно, но выглядит коряво. Если покопаться и как-то настроить, может что-то и получится, но у меня сейчас со временем напряг. Пробуй! =)) А потом поделись тем, что получилось.
А мой скомпилированный экзешник работает?
А мой скомпилированный экзешник работает? »
Да. Только фон появляется , если в скрипте изменить так :
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s'
зы без interface.exe можно, если :
nsDialogs::Create /NOUNLOAD 1044
4eshireCat
17-06-2014, 13:19
Да. Только фон появляется , если в скрипте изменить так :
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s' »
Сорри, торопился, возможно в спешке что-то не вполне корректно указал, хотя у меня и с моим вариантом все прекрасно работает.
Однако главное, что в конце-концов все получилось!
зы без interface.exe можно, если :
nsDialogs::Create /NOUNLOAD 1044 »
Действительно. Спасибо, возьму на заметку!
При установке для фона текста - transparent - фон устанавливается стандартного цвета... Что можно сделать ? »
Использовать плагин от Graphical Installer (http://www.graphical-installer.com) (см. вложение). Пример:
; ------------------- Checkbox 1 -----------------------
${NSD_CreateCheckbox} 25u 10u 70u 10u "Text Red Color"
Pop $1
# Устанавливаем цвет текста - красный, а цвет фона - прозрачный.
SetCtlColors $1 0xFF0000 transparent
# Задаем элементу дополнительные атрибуты стиля (прозрачность и поверх всех элементов)
${NSD_AddExStyle} $1 ${WS_EX_TRANSPARENT}|${WS_EX_TOPMOST}
# При включенной поддержке стилей ХР, чтобы элемент принял заданные параметры,
# для его обновления необходимо использовать метод SubclassCheckBox (используем плагин).
GraphicalInstaller::SubclassCheckBox /NOUNLOAD $1
Аналогично для элемента RadioButton. Данная проблема связана с ограничениями библиотеки стилей Windows и средствами NSIS её не решить, по крайней мере простыми методами. Необходимо элементу Checkbox (RadioButton) назначить дополнительные атрибуты и перевести его в группу подкласса, отвязав от остальных элементов окна. После чего нарисовать его новой (сообщением WM_PRINT или нечто подобным). В общем это задача для тех, кто хочет попробовать свои силы в кодинге средствами WinAPI на движке NSIS. Для остальных - пользуемся готовыми решениями.
Здравствуйте, нужно получить имя группы администраторов, как это правильно сделать?
System::Call 'netapi32::NetLocalGroupAddMembers
нужно получить имя группы администраторов »
Можно командно, как рассказано здесь : http://forum.oszone.net/thread-136097.html
или, зная SID - Administrators S-1-5-32-544 , получить имя с помощью API (LookupAccountSid + ещё куча всего), а лучше с помощью http://nsis.sourceforge.net/UserMgr_plug-in
или переконвертировать SID с помощью vbs :
http://www.thescriptlibrary.com/Default.asp?Action=Display&Level=Category3&ScriptLanguage=VBScript&Category1=Security&Category2=Other&Title=Convert+SID+to+Username
Если кто захочет заморочиться с API, то код приблизительно такой и хорошо бы его "причесать" и под конкретику и для универсальности :
# allocate SID_IDENTIFIER_AUTHORITY
System::Call "*(&i1 0, &i4 0, &i1 5) i.r0"
# allocate SID http://msdn.microsoft.com/en-us/library/windows/desktop/aa375213(v=vs.85).aspx
System::Call "advapi32::AllocateAndInitializeSid(i r0, i 1, i 20 , i 0, i 0, i 0, i 0, i 0, i 0, i 0, *i .r1)"
;System::Call "advapi32::AllocateAndInitializeSid(i r0, i 2, i 32, i 545, i 0, i 0, i 0, i 0, i 0, i 0, *i .r1)"
# free SID_IDENTIFIER_AUTHORITY
System::Free $0
# debug, see that the right SID was created
System::Call advapi32::ConvertSidToStringSid(ir1,*t.R0)
DetailPrint $R0
DetailPrint $2
# use SID to look-up account name * LookupAccountSid получает имя пользователя (группы) по заданному SID, а так же тип SID
/*SidTypeUser = 1; // SID пользователя
SidTypeGroup = 2; // группы
SidTypeDomain = 3; // домена
SidTypeAlias = 4; // встроенной группы
SidTypeWellKnownGroup = 5; // стандартной группы
SidTypeDeletedAccount = 6; // удаленной записи
SidTypeInvalid = 7; // неверный SID
SidTypeUnknown = 8; // неизвестный SID
SidTypeComputer = 9; // SID компьютера
SidTypeLabel = 10; // Обязательный SID ярлыка целостности*/
StrCpy $R0 ${NSIS_MAX_STRLEN}
System::Call "advapi32::LookupAccountSid(i 0, i r1, t .r0, *i R0, t .r2, *i R0, *i .r3)"
# free SID
System::Call "advapi32::FreeSid(i r1)"
# print result
DetailPrint $0
DetailPrint $2
DetailPrint $R1
MKN, как получить имя группы S-1-5-32-544 с помощью LookupAccountSid, нужен пример кода...
Узнать имя группы администраторов и вывести в MessageBox
UserMgr плагин тоже не оперирует SID идетификаторами
Otlanta,
Пример ведь дан. Используй в функции AllocateAndInitializeSid нужный SID, для твоего случая :
System::Call "advapi32::AllocateAndInitializeSid(i r0, i 2, i 32, i 544, i 0, i 0, i 0, i 0, i 0, i 0, *i .r1)"
Оказывается есть интересный приём для перемещения окна за любую точку (без плагина)
Используется идея отслеживания нажатия ЛКМ и посыла соответствующего сообщения окну - ${WM_SYSCOMMAND} с похоже, что, не документированным параметром SC_MOVE 0xF011
( на http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms646360(v=vs.85).aspx такого нет... )
!include MUI2.nsh
!insertmacro MUI_LANGUAGE "English"
Page custom nsDialogsPage
OutFile "MoveWindows.exe"
Function OnTimer
System::Call user32::GetKeyState(i1)i.r4
${If} $4 < 0
SendMessage $HWNDPARENT ${WM_SYSCOMMAND} 0xF011 0
${EndIf}
FunctionEnd
Function nsDialogsPage
nsDialogs::Create 1018
Pop $0
${NSD_CreateTimer} OnTimer 10
nsDialogs::Show
FunctionEnd
Section
SectionEnd
winver2.nsh определяет редакцию Windows 8 Single Language:
Windows 8 Single Language
поправьте пожалуйста чтоб обрезало Windows 8
Так же не определяет редакцию Home Premium французкой Windows 7 64-bit, пустое значение.
Ещё просьба сохранять winver2.nsh в UTF-8. Спасибо за плагин
winver2.nsh определяет редакцию Windows 8 Single Language: »
Так и должно быть
поправьте пожалуйста чтоб обрезало Windows 8 »
Зачем? Чтобы реализовать хидер конкретно для вас? А если кому-то нужно будет, чтобы данная редакция определялась как положено, что, мы будем снова править хидер и так постоянно?
Что мешает вам добавить в ваш скрипт небольшой код, который будет сам обрезать строку после определения ОС?
${WinType} $1
StrCmp $1 "Windows 8 N" 0 +2
StrCpy $1 "Windows 8"
StrCmp $1 "Windows 8 China" 0 +2
StrCpy $1 "Windows 8"
StrCmp $1 "Windows 8 Single Language" 0 +2
StrCpy $1 "Windows 8"
Так же не определяет редакцию Home Premium французкой Windows 7 64-bit, пустое значение. »
Насчет этого ничего не скажу, в хидере определение Home Premium версии прописано
Ещё просьба сохранять winver2.nsh в UTF-8 »
Аналогично с "Зачем? Чтобы реализовать хидер конкретно для вас?"
С текущим количеством текстовых редакторых с их возможностями, которые есть сейчас - думаю не проблема сохранить текстовый файл в другой кодировке
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC