Показать полную графическую версию : [архив].: NSIS - все вопросы :.
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
Для других страничек опытным путем вычислияем сколько раз нужно нажать клавишу, что бы попасть на нужный контрол.
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
Причем по логике всегда только одно окно в фокусе!
---
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:
и что в итоге добились? »
Я так понимаю, что ни хрена... :)
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}"
можете помочь? я не экстрасенс, и в справке про это не написано
kotkovets,
Как правильно детектировать Windows 8 ? В сегодняшнем WinVer.nsh её нет...
И есть ли не зависимый от WinVer.nsh, NSIS-OS plug-in, Version_plug-in и пр. , способ детектирования ОС ?
Уважаемые участники форума существует ли версия 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
----
остальное доработаю по мере обновления справки.
библиотека 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 для меню программы и компоненты надо для каждой разрядности прописывать отдельно или установщик сам разберется??
Здравствуйте.
Подскажите, пожалуйста, возможно ли и как сделать участок (функцию, секцию), которая бы выполнялась только при компиляции.
Например:
У меня есть список файлов (одна строка - один файл), который меняется пару раз на день. На основе этого списка должена формироваться инсталяшка. Я хочу реализовать такой механизм, чтоб при начале компиляции генерился список файлов и потом подключался в соответствующую секцию 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC