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
02-08-2012, 12:03
возможно ли в NSIS, при переходе по элементам управления сохранять фокус курсора в текстбоксе ? »
нет, при клике на кнопку фокус на кнопку перемещается - очевидно!Ведь в ряде программ, именно так и происходит - курсор моргает в одном месте, кликаем кнопку в другом - происходит вставка в местоположение курсора. Почему и как, там это можно ? »
в программах свой обработчик встроен, это не API, а проще сказать другие технологии встроенные
в компиллятор программы, для NSIS это равнозначно сторонний плагин писать, и брать оттуда
(с плага функции) тем более эти функции нужно разработать и заточить под NSIS!
А без 10-километрового кода это невозможно.Пока, как крайнее решение - при клике, данные заносятся в буфер, и вставляются в нужное место текстбокса, обычным образом, через контекст. »
Эти клики не заносятся в буфер, а передается соответствующие сообщение (SendMessage) с соответствующим свойством, к примеру WM_SETTEXT - все расписано в файлике - WinMessages.nsh (Prefix Message category)+ гугл и огромная масса примеров.
например в гугле вбиваешь - WM_SETTEXT for nsis
MKN опять же, без знаний API это невозможно делать...

MKN
02-08-2012, 12:06
Эти клики не заносятся в буфер, а передается соответствующие сообщение (SendMessage) с соответствующим свойством »
В буфер заносятся данные, попадающие в буфер после клика.
А SendMessage разве может помочь со вставкой в любое место, где находится курсор ?
(Хоть в середину любого слова или предложения из слов, хоть куда... ) Именно так мне и надо, именно так я и сделал по примеру ${StrClb} (возможно не оч удачно) через буфер и контекст...
для NSIS это равнозначно сторонний плагин »
А таковых на сегодня нет ?

kotkovets
02-08-2012, 14:13
А SendMessage разве может помочь со вставкой в любое место, где находится курсор ? »
не где курсор, а только указанием хэндла элемента (система каждому элементу присваивает идентификатор, например $HWNDPARENT - это идентификатор главного окна NSIS)
А где курсор находится тоже можно узнать, сводится к тому, найти хендл элемента - кому "принадлежит" курсор...
Хоть в середину любого слова или предложения из слов, хоть куда »
Опять же через SendMessage читаем текст, сбрасываем в переменную - обрабатываем и
снова SendMessagе используем для вставки текста.
Для текстовых контролов, надписей, кнопок есть же макросы:
${NSD_SetText} и ${NSD_GetText}

MKN
02-08-2012, 15:12
Опять же через SendMessage читаем текст, сбрасываем в переменную - обрабатываем и
снова SendMessagе используем для вставки текста. »
Интересно, как сбрасывать в переменную текст, который я только набираю в текстбоксе и пока неведома куда в этом тексте установлю курсор и вставлю данные в место курсора... Ну хорошо, лишним движением текст то сбросим, а вот как отсчитывать позицию курсора в этом тесте ?
Обычным образом, я устанавливаю курсор куда пожелаю и туда же делаю вставку, а если я при вводе текста (при чём разного и в процессе ввода изменяемого) десять раз передумаю куда поставить курсор - как отлавливать его положение в строке ?

В NSIS нет такой функции - определить положение курсора. Или есть ?

K.A.V.
02-08-2012, 15:38
В NSIS нет такой функции - определить положение курсора. Или есть ? »
Это умеет делать WinAPI...пиши свой плагин

Я для SFX Creator когда писал DLL (всплывающее меню переменных), то там использовал функцию GetCursorPos, чтобы менюшка появлялась именно из того места, где находился курсор в момент нажатия на кнопку

Я с System.dll не дружу, поэтому, может kotkovets тебе подскажет как описать вызов данной функции, чтобы получить координаты курсора мыши (X и Y), но не более...(а с координатами коретки вроде бы поможет функция GetCaretPos)

Если писать плагин для NSIS, то функцию можно описать вот так:


DLLIMPORT void GetCursorPositionMyFunc(HWND hwndParent, int string_size, char *variables, stack_t **stacktop){
EXDLL_INIT();
POINT cur_pos;
GetCursorPos(&cur_pos);
}

Координаты будут храниться в данных переменных
cur_pos.x
cur_pos.y

MKN
02-08-2012, 17:56
с координатами коретки вроде бы поможет функция GetCaretPos »
Типа , как здесь ? : http://stackoverflow.com/questions/6380222/getcaretpos-error-invalid-access-memory-location
или http://forums.winamp.com/showthread.php?t=331631
Только там пишут : "The p pointer type does not work in 2.46"
И я в этих API дебрях не разбираюсь... Ладно, тогда похороним задумку...

msn
03-08-2012, 00:20
подскажите плиз команду, которой можно свернуть все окна? (если такое возможно)

kotkovets
03-08-2012, 01:07
подскажите плиз команду, которой можно свернуть все окна? »
Элементарно! все окна:

!include "WinMessages.nsh"
;---
FindWindow $R9 "Shell_TrayWnd" ""
SendMessage $R9 ${WM_COMMAND} ${LB_GETCARETINDEX} 0

MKN
03-08-2012, 13:45
Вопрос1 : возможно ли изменить размер чекбоксов (на стандартных и кастомных страницах ) ?

Вопрос2 : Если для стандартной страницы компонентов, графику чекбоксов можно назначить через
!define MUI_COMPONENTSPAGE_CHECKBITMAP "*.bmp"
то как это сделать для кастомной страницы ?

kotkovets
03-08-2012, 16:13
MKN,
1) нет, на стандарте размер - да.
2) нет.
Эти ресурсы берутся из системных библиотек и нет нормальной
поддержки калбеков в nsDialogs, что бы заменить картинку.

MKN
03-08-2012, 16:58
kotkovets,
Возможно ли на кастомной странице устанавливать/снимать запрет установки/снятия отметки чекбоксов ? (вариант с EnableWindow $CheckBox - не то )

K.A.V.
03-08-2012, 19:57
Возможно ли на кастомной странице устанавливать/снимать запрет установки/снятия отметки чекбоксов ? »
Узнай handle чекбокса, затем выполняй команду

SendMessage $HANDLE ${BM_SETCHECK} СТАТУС 0
Где $HANDLE - handle чекбокса
СТАТУС - 0 = не отмечен ; 1 = отмечен

diakov
05-08-2012, 13:40
kotkovets, подскажи в чем может быть проблема
Хочу в один инстальник запихнуть две проги клинер и дефрагер
Ставлю InstallDir "$PROGRAMFILES64\Piriform"
при установке например дефрагер ставлю SetOutPath "$INSTDIR\Defraggler", то есть при установке получается "$PROGRAMFILES64\Piriform\Defraggler", но когда в секции удаления пишу например

Section Uninstall
RMDir /r "$INSTDIR\Defraggler"
SetShellVarContext all
RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}\Defraggler"
Delete "$Desktop\Defraggler.lnk"
Delete "$SMPROGRAMS\${PRODUCT_NAME}\Defraggler\Defraggler.lnk"
Delete "$SMPROGRAMS\${PRODUCT_NAME}\Defraggler\Удалить Defraggler.lnk"
SectionEnd

То папки именно Defraggler с меню удаляется...а вот сама директория с файлами $PROGRAMFILES64\Piriform\Defraggler нет, почему не отрабатывает команда RMDir /r "$INSTDIR\Defraggler"?

Парадокс...когда ставлю просто RMDir /r "$INSTDIR, то удаляет папку с файлами Defraggler, папку Piriform в PROGRAMFILES оставляет...тоесть делает то что нужно...но как то это не логично)

kotkovets
05-08-2012, 14:14
Парадокс... »
Не пародокс, деинсталлятор принимает значение $INSTDIR - с какого места он запущен

diakov
05-08-2012, 14:18
Короче идея такая хочу запихнуть три проги в один инстал...сначала делаю файл деинсталяции для каждой отдельно...а потом привязываю его в секцию установки для каждой проги через
WriteUninstaller "$INSTDIR\CCleaner\название готово.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" "DisplayName" "CCleaner"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" "UninstallPath" "$INSTDIR\CCleaner"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" "UninstallString" "$INSTDIR\CCleaner\название готово"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\CCleaner" "DisplayIcon" "$INSTDIR\CCleaner\CCleaner.exe"

Синхрофазотрон но работает, а при общей сборке секцию деинсталляции оставляю пустую..

diakov
05-08-2012, 15:20
Или как можно умнее сделать?

kotkovets
05-08-2012, 15:35
а потом привязываю его в секцию установки для каждой проги через »
Зачем?
Секция удаления общая одна....А вот привязать, что удалять, к папке программы и файлам программы элементарно:
Например поставили одним установщиком Winrar и 7z - соответственно деинсталлятор в каждой папке.
Section Uninstall
${If} ${FileExists} "$INSTDIR\7z.dll" ;удаляем 7z
;Здесь пишем команды удаления, для надежности - удаление строго по именам файлам.
${EndIf}
;---
${If} ${FileExists} "$INSTDIR\rar.dll" ;удаляем WinRar
;Здесь пишем команды удаления, для надежности - удаление строго по именам файлам.
${EndIf}
SectionEnd

diakov
05-08-2012, 15:51
Тогда получится что деинсталятор снесет обе проги...а у меня он сносит только ту что захотел пользователь не затрагивая функционала другой?

K.A.V.
05-08-2012, 16:07
Тогда получится что деинсталятор снесет обе проги. »
Вы читаете, что вам пишут?

Не пародокс, деинсталлятор принимает значение $INSTDIR - с какого места он запущен »
Скопируйте программу удаления в каталог с программой 7Zip и WinRAR, откуда запустят программу удаления, так и сработает код, который вам предоставил kotkovets

kotkovets
05-08-2012, 16:08
Тогда получится что деинсталятор снесет обе проги »
не снесет, отработает только одна логическая структура.
Главное деисталляторы должны быть в разных папках, а невложенных папках относительно одной папки.
В каждую логическую структуру прописываем именно свои команды удаления, включая реестр и т.д.
Ничего общего(по удалению) в каждом из трех деинсталляторов ничего не должно быть!
Сам так делаю и пользуюсь давным давно...




© OSzone.net 2001-2012