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

MKN
19-02-2013, 09:00
Озадачился я тут такой задачкой : Необходимо получить Callback при наведении указателя мыши и клике левой кнопкой мыши на любом объекте с известным ID, на любой страницы .
Т.е. - навёл мышь на объект, кликнул ЛКМ - произошло действие. Есть ли универсальное решение для такой задачи ?

Также интересно - возможно ли при вышеописанном действии, выделять границы объекта (на время нахождения указателя мыши в пределах границы объекта) ?

kotkovets
19-02-2013, 09:02
Есть ли универсальное решение для такой задачи ? »
нет, только плагин.

MKN
19-02-2013, 09:11
kotkovets,
А возможен ли обходной маневр - если вычислить координаты нужного объекта, а при клике ЛКМ, тут же вычисляется позиция курсора и вызывается функция сравнения "пересечения" границ координат указателя и объекта - что и вызывает событие при "пересечении" ?
Или это получится громозда, а не код...

MKN
20-02-2013, 16:27
Изменяем месторасположение полосы прогресс бара (индикатора процесса установки) на странице 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...), чтобы сообщение закрылось и установка завершилась, если не нажать на кнопку до истечения времени.

MKN
21-02-2013, 09:16
как установить таймер обратного отсчёта на кнопку сообщения (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. Такой вариант вполне годится.
А вообще, было бы интересно узнать подробнее, как поставить таймер на кнопку в таком сообщении.

Awral
21-02-2013, 21:25
Здравствуйте! Как изменить текст, который отображается над прогрессбаром на странице установки? Там показываются файлы, которые сейчас распаковываются. А мне нужно поставить свой текст. Это возможно?

Заранее спасибо

profcom
21-02-2013, 23:50
Здравствуйте! Как изменить текст, который отображается над прогрессбаром на странице установки? Там показываются файлы, которые сейчас распаковываются. А мне нужно поставить свой текст. Это возможно?
Заранее спасибо »
Конечно возможно, если справку читать. Тебе нужно установить атрибут SetDetailPrint. Пример:
SetDetailsPrint none
File "secret file.dat"
SetDetailsPrint both

А для отображение там своего текста пиши:
DetailPrint "бла бла бла"

MKN
22-02-2013, 11:27
Мне надо закрыть сообщение без предупреждений, что оно закроется »
Так и не предупреждай о закрытии. :)
Если нажать 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

MKN
25-02-2013, 17:34
Ещё раз о таймере... Отсчитать время можно также с помощью функции 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
возникла задача сделать небольшую програмку

при запуске просит выбрать букву диска съемного
а далее работает с этим диском (меняет атрибуты всех файлов)

как менять атрибуты файлов я догадываюсь а вот как определять букву диска не знаю. подскажите плииизз

все таки не нашел как менять атрибуты

K.A.V.
26-02-2013, 21:36
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. А можно ли вешать таймер на активную кнопку?

MKN
27-02-2013, 16:49
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