Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Озадачился я тут такой задачкой : Необходимо получить Callback при наведении указателя мыши и клике левой кнопкой мыши на любом объекте с известным ID, на любой страницы .
Т.е. - навёл мышь на объект, кликнул ЛКМ - произошло действие. Есть ли универсальное решение для такой задачи ?
Также интересно - возможно ли при вышеописанном действии, выделять границы объекта (на время нахождения указателя мыши в пределах границы объекта) ?
kotkovets
19-02-2013, 09:02
Есть ли универсальное решение для такой задачи ? »
нет, только плагин.
kotkovets,
А возможен ли обходной маневр - если вычислить координаты нужного объекта, а при клике ЛКМ, тут же вычисляется позиция курсора и вызывается функция сравнения "пересечения" границ координат указателя и объекта - что и вызывает событие при "пересечении" ?
Или это получится громозда, а не код...
Изменяем месторасположение полосы прогресс бара (индикатора процесса установки) на странице PAGE_INSTFILES
!include "MUI2.nsh"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW instfilesshow
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
OutFile "PositionProgBar.exe"
ShowInstDetails nevershow
Function instfilesshow
FindWindow $9 "#32770" "" $HWNDPARENT
GetDlgItem $8 $9 0x3EC
System::Call '*(i,i,i,i)i.r7'
System::Call 'USER32::GetClientRect(ir9,ir7)'
System::Call '*$7(i,i,i.r0,i.r1)'
System::Call 'USER32::GetWindowRect(ir8,ir7)'
System::Call '*$7(i.r2,i.r3,i.r4,i.r5)'
System::Free $7
; высота полоски прогресс бара
IntOp $5 $5 - $3 ;
;IntOp $5 $5 + 20
StrCpy $2 10
IntOp $4 $0 - 20
IntOp $0 $5 / 2
IntOp $1 $1 / 2
IntOp $1 $1 - $0
!define SWP_NOZORDER 4
System::Call 'USER32::SetWindowPos(ir8,i0,ir2,ir1,ir4,ir5,i${SWP_NOZORDER})'
FunctionEnd
Section
Sleep 500
SectionEnd
Функция GetClientRect извлекает координаты рабочей области окна. Рабочие координаты определяют левый верхний и
нижний правый углы рабочей области. Поскольку рабочие координаты определены относительно левого верхнего угла рабочей области окна, координаты левого верхнего угла - (0,0).
Функция GetWindowRect отыскивает размеры рамки ограничивающей прямоугольник определяемого окна.
Размеры даны в экранных координатах, которые расположены относительно левого верхнего угла экрана.
Функция SetWindowPos изменяет размер, позицию и Z-последовательность дочернего, выскакивающего или верхнего уровня окна.
Дочерние, выскакивающие и верхнего уровня окна размещаются по порядку согласно их появлению на экране.
Самое верхнее окно принимает самый высокий ранг и становится первым окном в Z-последовательности.
SWP_NOZORDER - Сохраняет текущую Z-последовательность (игнорирует параметр hWndInsertAfter - дескриптор порядка размещения).
Waterclo
21-02-2013, 04:38
Уважаемые!
Обнаружил полезный пример:
Установка на кнопку стандартной страницы, таймера с индикацией обратного отсчёта, т.е. задержка активности кнопки перед продолжением установки. »
Подскажите, как установить таймер обратного отсчёта на кнопку сообщения (MessageBox MB_OK...), чтобы сообщение закрылось и установка завершилась, если не нажать на кнопку до истечения времени.
как установить таймер обратного отсчёта на кнопку сообщения (MessageBox MB_OK...), чтобы сообщение закрылось и установка завершилась, если не нажать на кнопку до истечения времени. »
Можно, почти то же самое, но проще. "Почти" - это без визуализации отсчёта, отсчёт идёт, но скрытно... Уже был пример от kotkovets, :
!include "MUI2.nsh"
!insertmacro MUI_LANGUAGE "English"
OutFile "MessageBoxTimeout.exe"
!define MsgBoxTimeout "!insertmacro macro__MsgBoxTimeout"
!macro macro__MsgBoxTimeout text caption_text time
System::Call "user32::MessageBoxTimeout(i$HWNDPARENT, t`${text}`, t`${caption_text}`,i0,i0, i${time})"
!macroend
Section
${MsgBoxTimeout} "Сообщение закроется через 2 секунды" "MessageBoxTimeout" 2000
SectionEnd
Можно конечно попробовать ждать появления окна MessageBox MB_OK, найти в нём ID кнопки и "повесить" на него Delay::DelayButton.
Waterclo
21-02-2013, 15:30
пример от kotkovets »
Спасибо, проглядел я этот пример. Однако, это не совсем то что нужно. Мне надо закрыть сообщение без предупреждений, что оно закроется:
MessageBox MB_OK|MB_ICONEXCLAMATION "Продолжить установку?" IDOK Start
Если нажать OK, то установка продолжится, а если время истекло, то переход на Exit. Такой вариант вполне годится.
А вообще, было бы интересно узнать подробнее, как поставить таймер на кнопку в таком сообщении.
Здравствуйте! Как изменить текст, который отображается над прогрессбаром на странице установки? Там показываются файлы, которые сейчас распаковываются. А мне нужно поставить свой текст. Это возможно?
Заранее спасибо
Здравствуйте! Как изменить текст, который отображается над прогрессбаром на странице установки? Там показываются файлы, которые сейчас распаковываются. А мне нужно поставить свой текст. Это возможно?
Заранее спасибо »
Конечно возможно, если справку читать. Тебе нужно установить атрибут SetDetailPrint. Пример:
SetDetailsPrint none
File "secret file.dat"
SetDetailsPrint both
А для отображение там своего текста пиши:
DetailPrint "бла бла бла"
Мне надо закрыть сообщение без предупреждений, что оно закроется »
Так и не предупреждай о закрытии. :)
Если нажать OK, то установка продолжится, а если время истекло, то переход на Exit.»
Сделай так, как тебе надо, исходя из Return Code. Ещё раз код :
!include "MUI2.nsh"
!insertmacro MUI_LANGUAGE "English"
OutFile "MsgBoxTimeout.exe"
!macro MsgBox out text title flags
;обыкновенное сообщение
;System::Call "user32::MessageBox(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}) i.s"
;сообщение с таймером с примером значения задержки - 2с
System::Call "user32::MessageBoxTimeout(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}, i 0, i 2000) i.s"
Pop ${out}
!macroend
Section
!insertmacro MsgBox $0 " Текст сообщения " " Заголовок " 0x40|0x0
MessageBox MB_OK "Return Code: $0"
SectionEnd
Что в примере кода обозначает 0x40|0x0 :
Кнопки в сообщении и надписи действий на кнопках
0x0 - ОК
0x1 - ОК Отмена
0x2 - Прервать Повтор Пропустить
0x3 - Да Нет Отмена
0x4 - Да Нет
0x5 - Повтор Отмена
0x6 - Отмена Повторить Продолжить
0x4000 - ОК Справка
Значок сообщения :
0x10 - Белый X-крест в красном круге
0x20 - Вопросительный знак в "всплывающем облаке"
0x30 - Восклицательный знак в жёлтом треугольнике
0x40 - Восклицательный знак в "всплывающем облаке"
Инфо : http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx
Ещё раз о таймере... Отсчитать время можно также с помощью функции timeGetTime
Эта функция якобы менее ресурсоёмкая, сравнительно с GetTickCount...
OutFile "Elapsed Time-timeGetTime.exe"
Section
System::Call "winmm::timeGetTime() i .r0 ?r"
Sleep 1200
System::Call "winmm::timeGetTime() i .r1 ?r"
System::Free 0
IntOp $0 $1 - $0
IntOp $1 $0 / 1000
IntOp $0 $0 % 1000
IntOp $2 $1 / 60
IntOp $1 $1 % 60
IntOp $3 $2 / 60
IntOp $2 $2 % 60
MessageBox MB_OK "Elapsed Time $3 hours $2 min $1 sec $0 ms"
SectionEnd
А если нужна высокая точность подсчёта, то рекомендуют применять функцию QueryPerformanceCounter ,
которая извлекает текущее значение счетчика высокого разрешения.
Только зачем это нужно на практике не ясно... Эту функцию чаще применяют для всякой Random_изации, что есть тоже не понятное явление для практики...
Обычного подсчёта мне добиться не удалось... Синтаксис был такой ("основной" ,без вычитания...) :
System::Call "kernel32::QueryPerformanceCounter(*l.r0)"
System::Free 0
System::Int64Op $0 / 1000000 ;; конвертация полученого значения в иное измерение (вроде как наносекунды в секунды)
Pop $1 # почему 1 ?
kotkovets
25-02-2013, 19:45
System::Free 0
Pop $1 # почему 1 ? »
System::Call "kernel32::QueryPerformanceCounter(*l.r1)i.R0"
sleep 500
System::Call "kernel32::QueryPerformanceCounter(*l.r2)"
System::Int64Op $2 - $1
pop $3
MessageBox MB_OK "$$2 = $2$\n$$1 = $1$\n$$3 = $3$\nвозврат QueryPerformanceCounter = $R0" IDOK
QueryPerformanceCounter - возвращает булево значение, т.е $R0 = 1 --> функция отработала нормально
Что функция возвратила в буфер - не понятно, может тут и числа быть с плавающей запятой, который NSIS
не умеет работать (хотя стандарный плаг Math (для мат. вычислений) умеет.
Дерзай! :)
andryz80
26-02-2013, 21:21
возникла задача сделать небольшую програмку
при запуске просит выбрать букву диска съемного
а далее работает с этим диском (меняет атрибуты всех файлов)
как менять атрибуты файлов я догадываюсь а вот как определять букву диска не знаю. подскажите плииизз
все таки не нашел как менять атрибуты
andryz80, Справочник по NSIS (http://forum.oszone.net/thread-168287.html)
GetDrives: перечисляем устройства хранения информации
Locate: поиск файлов/папок и не только...
Аттрибуты файлам устанавливаются командой SetFileAttributes
SetFileAttributes "$WINDIR\explorer.exe" HIDDEN|READONLY
Аттрибуты, которые можно установить: NORMAL, ARCHIVE, HIDDEN, OFFLINE, READONLY, SYSTEM, TEMPORARY
ИХ можно комбинировать, т.е. для файла указывать сразу несколько аттрибутов, только разделить их нужно вертикальной чертой (пример выше)
andryz80
26-02-2013, 22:07
а атрибуты папок какой командой менять?
andryz80
26-02-2013, 23:00
кстати может я велосипед изобретаю? планирую програмку сделать дл борьбы с вирусом, который на флешке прячет файлы.
может уже есть готовая?
kotkovets
26-02-2013, 23:10
а атрибуты папок какой командой менять? »
Что не понятного?
SetFileAttributes "$WINDIR\explorer.exe" HIDDEN|READONLY »
пишем путь к папке и удивляемся...!
дл борьбы с вирусом, который на флешке прячет файлы »
бред... :biggrin:
andryz80
26-02-2013, 23:36
почему бред?
вполне под силу исправить реестр (отключение возможности загрузки в защищенном режиме)
почистить папки в которых прописывается вирус
удалить на флешке папку с вирусом авторан и ярлыки
изменить атрибуты папок
вроде должно сработать
Waterclo
27-02-2013, 12:04
Что функция возвратила в буфер - не понятно »
Вот в том всё и дело! Я вообще сообразить не в состоянии, по причине довольно скудных познаний в таких NSISько строительных операциях.
SOS! Мне надо как-то привести к общему знаменателю кусок кода, только никак не могу собразить как это заставить перейти на Start: - после нажатия OK, а без нажатия - на Exit:, если функция в любом случае возвращает 1, нажимай ОК или не нажимай:
!include "MUI.nsh"
SilentInstall Silent
OutFile "Install.exe"
!insertmacro MUI_LANGUAGE Russian
!macro MsgBox out text title flags
System::Call "user32::MessageBoxTimeout(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}, i 0, i 5000) i.s"
Pop ${out}
!macroend
Section "MessageBox"
!insertmacro MsgBox $0 "Продолжим установку?" "Оконо закроется через 5 сек." 0x40|0x40
Start:
nsDialogs::SelectFileDialog open "" "Приложение (*.exe;*.msi)|*.exe;*.msi|Файлы (*.reg;*.bat;*.cmd;*.js;*vbs)|*.reg;*.bat;*.cmd;*.js;*vbs|"
Pop $1
StrCmp $1 "" Cancel
MessageBox MB_OK|MB_ICONINFORMATION "Выбран файл $1"
ExecWait "$1"
Goto Retry
Cancel:
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION "Выберите файл." IDRETRY Start
Retry:
MessageBox MB_YESNO|MB_DEFBUTTON2|MB_ICONQUESTION "Установим что-то ещё?" IDYES Start IDNO Exit
Exit:
SetAutoClose true
SectionEnd
Вот ещё вопрос:
Можно конечно попробовать ждать появления окна MessageBox MB_OK, найти в нём ID кнопки и "повесить" на него Delay::DelayButton. »
Тут тоже интересно, нигде не могу найти какие функции обеспечивает Delay.dll. А можно ли вешать таймер на активную кнопку?
Waterclo,
Для различия кодов возврата надо использовать сообщение типа 0x1 (или иное "несколькокнопочное", с учётом конкретных кодов возврата)
!include "MUI2.nsh"
!insertmacro MUI_LANGUAGE "English"
OutFile "MsgBoxTimeout.exe"
!macro MsgBox out text title flags
System::Call "user32::MessageBoxTimeout(i $HWNDPARENT, t '${text}', t '${title}', i ${flags}, i 0, i 2000) i.s"
Pop ${out}
!macroend
Section
!insertmacro MsgBox $0 " Текст сообщения " " Заголовок " 0x40|0x1
;MessageBox MB_OK "Return Code: $0"
${If} $0 != 1
MessageBox MB_OK "Прошло 2 с. Значит Exit или ещё чего там..."
Quit
${EndIf}
MessageBox MB_OK "нажали ОК, значит делаем то то"
SectionEnd
Delay.dll - любительское творение и чего умеет, кроме ранее описанного, не известно.
А вешать таймер отсчёта на кнопку в сообщении - хлопотно и наверняка громоздко. И стоит ли оно того... Может конечно кто и заинтересуется и напишет плаг, но маловероятно...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.