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

Flix
15-06-2014, 01:23
Озадачился вроде как простым вопросом - как на кастомной странице изменить цвет текста в поле чекбокса ? ... Или я что то не так делаю ?»
Самый простой вариант - это отключить в сценарии поддержку стилей ХР: XPStyle off
Тогда для чекбокса сможете указывать командой SetCtlColors какой угодно цвет текста. :)

_ck
15-06-2014, 12:16
Доброго времени суток! Подскажите,пожалуйста,почему в "Установке и удалении программ" (xp) или в "Программах и компонентах " (7) не отображается размер установленной программы? Имя,сайт,комментарий и т.д всё отображается,а размер нет.Просто пустое поле.Что нужно сделать?

K.A.V.
15-06-2014, 12:42
Доброго времени суток! Подскажите,пожалуйста,почему в "Установке и удалении программ" (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 - размер программы в килобайтах

_ck
15-06-2014, 13:50
Спасибо! Помогло! Теперь в и ХР и в 7 размер отображается корректно!

Скажите,а можно в элементе "text" разрешить ввод только латинских символов? Я знаю,есть флаг "OnlyNumbers",а нужно,чтобы можно было писать цифрами и английскими буквами.

K.A.V.
15-06-2014, 14:36
Скажите,а можно в элементе "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 (описание опять же, есть в справочнике) проверяем значение переменной, если в переменной пусто - русских символов нет в строке

_ck
15-06-2014, 15:32
Ох спасибо огромное! Всё здорово работает! :up Русские буквы вычисляет как надо! :)

MKN
17-06-2014, 11:42
отключить в сценарии поддержку стилей ХР: XPStyle off »
Действительно, так цвет текста работает, но только в классическом случае... А у меня фоном кастомной страницы - bmp изображение и этот номер не проходит...
При установке для фона текста - transparent - фон устанавливается стандартного цвета... Что можно сделать ?

Также интересует вопрос - как перетаскивать окно без заголовка ( с использованием плагина MoveAnywhere.dll ), если фон страницы - bmp изображение ? С таким фоном перетаскивание не работает...

4eshireCat
17-06-2014, 12:46
Также интересует вопрос - как перетаскивать окно без заголовка ( с использованием плагина MoveAnywhere.dll ), если фон страницы - bmp изображение ? »

Вот накидал кое-что, попробуй (см. прикрепленный архив)
PS Закрытие окна Alt+F4

MKN
17-06-2014, 12:53
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 никак нельзя обойтись ? »

Обойтись можно, но выглядит коряво. Если покопаться и как-то настроить, может что-то и получится, но у меня сейчас со временем напряг. Пробуй! =)) А потом поделись тем, что получилось.

А мой скомпилированный экзешник работает?

MKN
17-06-2014, 13:13
А мой скомпилированный экзешник работает? »
Да. Только фон появляется , если в скрипте изменить так :
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 »

Действительно. Спасибо, возьму на заметку!

Flix
17-06-2014, 14:28
При установке для фона текста - 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. Для остальных - пользуемся готовыми решениями.

Otlanta
18-06-2014, 12:03
Здравствуйте, нужно получить имя группы администраторов, как это правильно сделать?
System::Call 'netapi32::NetLocalGroupAddMembers

MKN
18-06-2014, 13:03
нужно получить имя группы администраторов »
Можно командно, как рассказано здесь : 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

Otlanta
18-06-2014, 19:02
MKN, как получить имя группы S-1-5-32-544 с помощью LookupAccountSid, нужен пример кода...

Узнать имя группы администраторов и вывести в MessageBox


UserMgr плагин тоже не оперирует SID идетификаторами

MKN
19-06-2014, 10:51
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)"

MKN
20-06-2014, 11:18
Оказывается есть интересный приём для перемещения окна за любую точку (без плагина)
Используется идея отслеживания нажатия ЛКМ и посыла соответствующего сообщения окну - ${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

Otlanta
21-06-2014, 18:21
winver2.nsh определяет редакцию Windows 8 Single Language:
Windows 8 Single Language
поправьте пожалуйста чтоб обрезало Windows 8




Так же не определяет редакцию Home Premium французкой Windows 7 64-bit, пустое значение.
Ещё просьба сохранять winver2.nsh в UTF-8. Спасибо за плагин

K.A.V.
23-06-2014, 13:27
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