PDA

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


Страниц : 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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 [165] 166 167 168 169 170

kotkovets
20-10-2012, 11:57
фокус был на кнопке, находящейся на кастомной странице »
я тебе уже давал когда то такой макрос:
!define VK_TAB 0x9
!define keybd_event "!insertmacro macro_keybd_event"
!macro macro_keybd_event setkey intkey
!ifndef keybd
!define keybd
!define KEYEVENTF_EXTENDEDKEY 0x0001
!define KEYEVENTF_KEYUP 0x0002
!endif
System::Store S
${For} $0 1 ${intkey}
System::Call "user32::keybd_event(i${setkey}, i0x45, i${KEYEVENTF_EXTENDEDKEY}|0, i0)"
System::Call "user32::keybd_event(i${setkey}, i0x45, i${KEYEVENTF_EXTENDEDKEY}|${KEYEVENTF_KEYUP}, i0)"
${Next}
System::Store L
!macroend
Ну для твоего кода вызов такой:
${keybd_event} ${VK_TAB} 2
т.е 2 раза эмулируем нажитие клавиши - Tab
Для других страничек опытным путем вычислияем сколько раз нужно нажать клавишу, что бы попасть на нужный контрол.

MKN
20-10-2012, 12:21
kotkovets,
Этот вариант я помню. Только имитация нажатий - это обходной и громоздкий манёвр... Неужели нельзя более изящно навести фокус на нужную кнопку ?
Для чего тогда вообще нужно - ${NSD_SetFocus} ?

kotkovets
20-10-2012, 12:33
Неужели нельзя более изящно навести фокус на нужную кнопку ? »
это очень мегаизящный вариант :) эмулировать нажатие любой клавиши - причем еще заданное n-раз!
Для чего тогда вообще нужно - ${NSD_SetFocus} ? »
Функция SetFocus отправляет сообщение WM_KILLFOCUS окну, которое теряет фокус клавиатуры, а сообщение WM_SETFOCUS окну, которое принимает фокус клавиатуры. Она также активизирует или окно, которое принимает фокус или родителя этого окна.
Если окно активное, но не имеет фокуса, любая нажатая клавиша произведет сообщение WM_SYSCHAR, WM_SYSKEYDOWN или WM_SYSKEYUP. Если клавиша VK_MENU также нажата, параметр lParam сообщения будет иметь установленным 30-й бит. Иначе, созданные сообщения не получат установки этого бита.
:) :) :)
ну не обрабатывает окно nsis посылку WM_SETFOCUS
Причем по логике всегда только одно окно в фокусе!
---

MKN
20-10-2012, 12:45
kotkovets,
Вот тут тоже бились с установкой фокуса http://forums.winamp.com/showthread.php?t=187302
Только я смутно понял что получилось... Можно ли извлечь из этого нечто полезное для моего случая ?
И что такое - kernel32::CreateMutexA ?

kotkovets
20-10-2012, 13:01
И что такое - kernel32::CreateMutexA ? »
мутекс... :biggrin:
---
Mutex позволяет проводить синхронизацию не только между потоками(thread), но и процессами(process), то есть между приложениями.
---
http://purebasic.ru/manual.php?id=1306&lng=rus
пример в справке - » Предотвращение множественности запуска приложени, т.е больше одной копии не запустим.Вот тут тоже бились с установкой фокуса http://forums.winamp.com/showthread.php?t=187302 »
и что в итоге добились? :biggrin:

MKN
20-10-2012, 13:03
и что в итоге добились? »
Я так понимаю, что ни хрена... :)

CrashTest
20-10-2012, 13:45
У меня вопрос про ассоциации. Как я понял ассоциации можно сделать по разному.
А если установщик программы или сама программа может себя ассоциировать то мне нужно сделать так же или можно по своему?

Я тут проследил за реестром и нашел какие ключи записывает программа для ассоциации. мне просто заставить свой установщик записывать такие ключи?

Однако я распаковал скрипт установщика и там я не нашел записей для реестре для ассоциаций.

При установки пишет:

Установка ассоциаций с файлами ВВВВ...
Выполнение "C:\Program Files\Programma\Programma.exe" /RegisterFileTypes

Как я понимаю, установщик создает процесс программы, причем тихий, никаких окон нет, и видимо заходит в Настройки - Дополнительно и нажимает кнопку Регистрация.

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

CrashTest
20-10-2012, 17:40
выяснил
если по нормальному
InstallDir "$PROGRAMFILES64\${PRODUCT_NAME}"
ключи в реестре не удаляются

поставить пробел или другой символ например слеш, то ключи удаляются.

InstallDir "$PROGRAMFILES64\ ${PRODUCT_NAME}"


можете помочь? я не экстрасенс, и в справке про это не написано

MKN
22-10-2012, 11:58
kotkovets,
Как правильно детектировать Windows 8 ? В сегодняшнем WinVer.nsh её нет...
И есть ли не зависимый от WinVer.nsh, NSIS-OS plug-in, Version_plug-in и пр. , способ детектирования ОС ?

profcom
22-10-2012, 12:44
Уважаемые участники форума существует ли версия InstallOptionsEx работающая с unicod NSIS ?

kotkovets
22-10-2012, 12:44
Как правильно детектировать Windows 8 ? »
а чем она отличается от других версий? только циферями...
MinorVersion - младшей версией Windows...
MinorVersion Win8 = 2, в Win7 = 1
библиотека winver2.nsh из справки...
http://imageshack.us/a/img838/3747/werbmp.png
----
остальное доработаю по мере обновления справки.

MKN
22-10-2012, 13:44
библиотека winver2.nsh из справки... »
А всё же, можно ли без библиотеки ? System::Call "user32:: и чего то для определения ОС... :)

kotkovets
22-10-2012, 14:39
MKN, я же говорил, почти все все работает на апи в NSIS - открой winver или winver2
дабы не писать - System::Call "user32:, которое уже расписано библиотеках в виде макросов для удобства.
из winver2:
!macro FUNC_GetVersionEx STRUCT_SIZE
System::Call "*$9(i${STRUCT_SIZE})"
System::Call "kernel32::GetVersionEx(ir9)i.R0"
!macroend

!macro FUNC_OSVERSIONINFOEX
System::Alloc ${OSVERSIONINFOEX_SIZE}
Pop $9
!insertmacro FUNC_GetVersionEx ${OSVERSIONINFOEX_SIZE}
${IfThen} $R0 = 0 ${|} !insertmacro FUNC_GetVersionEx ${OSVERSIONINFO_SIZE} ${|}
System::Call "*$9(i.R2, i.r0, i.r1, i.r2, i.r3, &t128.r4, &i2.r5, &i2.r6, &i2.r7, &i1.r8, &i1)"
System::Free $9
!macroend
теже яйца вид сбоку, и еще объявить штук 200 констант... так хочется в скрипте писать?
---
или подключить winver2.nsh и написать так:
${WinVersionMinor} $0
для стандартного winver:
${WinVerGetMinor} $0
а почему winver2 читай в справке. читать внимательно когда будем? А всё же, можно ли без библиотеки ? »
через реестр, но это для меня ненадежный вариант - легко циферки подправить чем угодно...
исход известен...
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

CrashTest
24-10-2012, 10:40
вот если 32 и 64 разрядность то в установщике надо прописать ключи реестра для каждой разрядности отдельно. а для секции в реестре Uninstall для меню программы и компоненты надо для каждой разрядности прописывать отдельно или установщик сам разберется??

shut
24-10-2012, 18:43
Здравствуйте.

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

Например:
У меня есть список файлов (одна строка - один файл), который меняется пару раз на день. На основе этого списка должена формироваться инсталяшка. Я хочу реализовать такой механизм, чтоб при начале компиляции генерился список файлов и потом подключался в соответствующую секцию includ'ом. Возможно ли это, или проще написать exe-шник который это сам делал а потом запускал компиляцию?

kotkovets
24-10-2012, 19:25
вот если 32 и 64 разрядность то в установщике надо прописать ключи реестра для каждой разрядности отдельно. »
Вот вы попробуйте для начала.. а потом пишите
У меня есть список файлов (одна строка - один файл), который меняется пару раз на день. На основе этого списка должена формироваться инсталяшка. Я хочу реализовать такой механизм, чтоб при начале компиляции генерился список файлов и потом подключался в соответствующую секцию includ'ом. Возможно ли это, или проще написать exe-шник который это сам делал а потом запускал компиляцию? »
Можно создавать файлик при компиляции
outfile "test.exe"

!delfile "C:\file.nsh" ;удаляем файл, если есть предыдущий
!tempfile "C:\file.nsh" ;создаем файл
!appendfile "C:\file.nsh" '!define msgBox "MessageBox MB_OK test_oszone"$\n' ;запись в файл

!include "C:\file.nsh"

Section
${msgBox}
SectionEnd
т.е пишем файлик строго в аля стиле NSIS!
но парсить какие файлы и создавать список можно попробовать командной строкой (консольными прогами винды)
типа dir.exe запущенной во время компиляции с определенными ключами(здесь я не силен, задайте на форуме этот вопрос в соответствущей теме)
Запуск файла можно так:
!system "%WINDIR%\notepad.exe"
ну а далее как примером выше. Вообще в NSIS команды препроцессора начинаются с - !
смотрите подробно в справке...
---
получается типа динамический скрипт... :)

CrashTest
24-10-2012, 20:25
Вот вы попробуйте для начала.. а потом пишите »
А я попробовал и спрашиваю Вас.

${If} ${RunningX64}
File "64\files.exe"
SetRegView 32
WriteRegDWORD HKCU "Software\programs\files\Settings" "language" "1049"
WriteRegDWORD HKCU "Software\programs\files\Settings" "check-updates" "0"
WriteRegDWORD HKCU "Software\Aprograms\files\Settings" "warn-not-default-viewer" "0"
WriteRegStr HKCU "Software\programs\files\Settings" "version" "2.0.1"
MessageBox MB_OK "C:\Program Files (x86)"
SetRegView 64
WriteRegDWORD HKCU "Software\programs\files\Settings" "language" "1049"
WriteRegDWORD HKCU "Software\programs\files\Settings" "check-updates" "0"
WriteRegDWORD HKCU "Software\programs\files\Settings" "warn-not-default-viewer" "0"
WriteRegStr HKCU "Software\programs\files\Settings" "version" "2.0.1"
MessageBox MB_OK "C:\Program Files (x64)"
${Else}
File "g\App\prog\files.exe"
${EndIf}
Вот так будет работать? Может быть стоит SetRegView 32 поместить после оператора ${Else}? или без разницы?


Мой Вопрос:
Надо ли этот ключ распределять между SetRegView 32 и 64

WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\prog.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe"

???

Зачем это проверять, если вы можете дать точный ответ. И все равно я не смогу увидеть через какой редактор заносились записи.

kotkovets
24-10-2012, 21:45
Вот так будет работать? Может быть стоит SetRegView 32 поместить после оператора ${Else}? или без разницы? »
а может стоит почитать в справочнике:
1. SetRegView: использование реестра от разрядности ОС
2. Логические конструкции в скриптах NSIS
---
На все эти вопросы ответы есть. + посмотреть содержимое файла NSIS\Include\x64.nsh

CrashTest
24-10-2012, 22:05
kotkovets, тяжело так сказать... но я пишу насчет секций для удаления. их тоже заключать в setregview? не написано это в справке

kotkovets
24-10-2012, 22:07
их тоже заключать в setregview? »
Конечно! это же отдельная программа!




© OSzone.net 2001-2012