Показать полную графическую версию : [архив].: NSIS - все вопросы :.
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 это невозможно делать...
Эти клики не заносятся в буфер, а передается соответствующие сообщение (SendMessage) с соответствующим свойством »
В буфер заносятся данные, попадающие в буфер после клика.
А SendMessage разве может помочь со вставкой в любое место, где находится курсор ?
(Хоть в середину любого слова или предложения из слов, хоть куда... ) Именно так мне и надо, именно так я и сделал по примеру ${StrClb} (возможно не оч удачно) через буфер и контекст...
для NSIS это равнозначно сторонний плагин »
А таковых на сегодня нет ?
kotkovets
02-08-2012, 14:13
А SendMessage разве может помочь со вставкой в любое место, где находится курсор ? »
не где курсор, а только указанием хэндла элемента (система каждому элементу присваивает идентификатор, например $HWNDPARENT - это идентификатор главного окна NSIS)
А где курсор находится тоже можно узнать, сводится к тому, найти хендл элемента - кому "принадлежит" курсор...
Хоть в середину любого слова или предложения из слов, хоть куда »
Опять же через SendMessage читаем текст, сбрасываем в переменную - обрабатываем и
снова SendMessagе используем для вставки текста.
Для текстовых контролов, надписей, кнопок есть же макросы:
${NSD_SetText} и ${NSD_GetText}
Опять же через SendMessage читаем текст, сбрасываем в переменную - обрабатываем и
снова SendMessagе используем для вставки текста. »
Интересно, как сбрасывать в переменную текст, который я только набираю в текстбоксе и пока неведома куда в этом тексте установлю курсор и вставлю данные в место курсора... Ну хорошо, лишним движением текст то сбросим, а вот как отсчитывать позицию курсора в этом тесте ?
Обычным образом, я устанавливаю курсор куда пожелаю и туда же делаю вставку, а если я при вводе текста (при чём разного и в процессе ввода изменяемого) десять раз передумаю куда поставить курсор - как отлавливать его положение в строке ?
В NSIS нет такой функции - определить положение курсора. Или есть ?
В 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
с координатами коретки вроде бы поможет функция 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 дебрях не разбираюсь... Ладно, тогда похороним задумку...
подскажите плиз команду, которой можно свернуть все окна? (если такое возможно)
kotkovets
03-08-2012, 01:07
подскажите плиз команду, которой можно свернуть все окна? »
Элементарно! все окна:
!include "WinMessages.nsh"
;---
FindWindow $R9 "Shell_TrayWnd" ""
SendMessage $R9 ${WM_COMMAND} ${LB_GETCARETINDEX} 0
Вопрос1 : возможно ли изменить размер чекбоксов (на стандартных и кастомных страницах ) ?
Вопрос2 : Если для стандартной страницы компонентов, графику чекбоксов можно назначить через
!define MUI_COMPONENTSPAGE_CHECKBITMAP "*.bmp"
то как это сделать для кастомной страницы ?
kotkovets
03-08-2012, 16:13
MKN,
1) нет, на стандарте размер - да.
2) нет.
Эти ресурсы берутся из системных библиотек и нет нормальной
поддержки калбеков в nsDialogs, что бы заменить картинку.
kotkovets,
Возможно ли на кастомной странице устанавливать/снимать запрет установки/снятия отметки чекбоксов ? (вариант с EnableWindow $CheckBox - не то )
Возможно ли на кастомной странице устанавливать/снимать запрет установки/снятия отметки чекбоксов ? »
Узнай handle чекбокса, затем выполняй команду
SendMessage $HANDLE ${BM_SETCHECK} СТАТУС 0
Где $HANDLE - handle чекбокса
СТАТУС - 0 = не отмечен ; 1 = отмечен
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 - с какого места он запущен
Короче идея такая хочу запихнуть три проги в один инстал...сначала делаю файл деинсталяции для каждой отдельно...а потом привязываю его в секцию установки для каждой проги через
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"
Синхрофазотрон но работает, а при общей сборке секцию деинсталляции оставляю пустую..
Или как можно умнее сделать?
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
Тогда получится что деинсталятор снесет обе проги...а у меня он сносит только ту что захотел пользователь не затрагивая функционала другой?
Тогда получится что деинсталятор снесет обе проги. »
Вы читаете, что вам пишут?
Не пародокс, деинсталлятор принимает значение $INSTDIR - с какого места он запущен »
Скопируйте программу удаления в каталог с программой 7Zip и WinRAR, откуда запустят программу удаления, так и сработает код, который вам предоставил kotkovets
kotkovets
05-08-2012, 16:08
Тогда получится что деинсталятор снесет обе проги »
не снесет, отработает только одна логическая структура.
Главное деисталляторы должны быть в разных папках, а невложенных папках относительно одной папки.
В каждую логическую структуру прописываем именно свои команды удаления, включая реестр и т.д.
Ничего общего(по удалению) в каждом из трех деинсталляторов ничего не должно быть!
Сам так делаю и пользуюсь давным давно...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC