Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Ещё раз о запрете перетаскивания окон-страниц.
Китайские "NSISадмины" для этого, обезглавливают окно одной строкой в CUSTOMFUNCTION_GUIINIT (или PAGE_CUSTOMFUNCTION_SHOW) :
OutFile "NoWindowTitle.exe"
!include "MUI2.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT GUIInit
;!define MUI_PAGE_CUSTOMFUNCTION_SHOW Custom
!insertmacro MUI_PAGE_WELCOME
;!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
;Function Custom
Function GUIInit
System::Call `user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},0x9480084C)i.R0`
FunctionEnd
Section
SectionEnd
Не уверен, что так корректно, но работает... И ещё нигде не нашёл инфы о константе(?) 0x9480084C
Что бы это значило ?
ps offtop По заявлению IT-corp AOL - скоро будет закрыт проект winamp и сайт winamp.com, тогда что, и форум закроют ? Т.е. мировой центр NSIS разработки и общения NSIS_овцев... Тогда на белом свете останется только forum.oszone NSIS... Сюда потянутся пользователи со всего света, мировая NSIS дискуссия, Нью-Nsis Васюки.... :)
Не уверен, что так корректно, но работает... И ещё нигде не нашёл инфы о константе(?) 0x9480084C
Что бы это значило ? »
Да какая разница, какой метод...Что ты удаляешь стили окна напрямую в modern.exe, что ты при запуске делаешь этой командой...смысл один и тот же.
Последний параметр в функции устанавливает стиль окна, там суммируются разные стили по кодам стилей, вот и всё (SetWindowLong (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspx))
Корректней было бы сначала получить стиль своего окна с помощью GetWindowLong (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633584(v=vs.85).aspx), из этого стиля удалить необходимые стили и использовать "обрезанный" стиль как 3-ий параметр в SetWindowLong, как показал вам ЗДЕСЬ (http://forum.oszone.net/post-2248632-723.html) уважаемый Вячеслав :)
Сюда потянутся пользователи со всего света, мировая NSIS дискуссия, Нью-Nsis Васюки.... »
Будет кому отвечать в этой теме кроме авторов справочника на все хотелочки :) а мы на покой :biggrin:
Limonica
21-11-2013, 11:57
Можно пример скрипта определения раскладки клавиатуры или языка ОС, и если он англ. - завершение работы скрипта. Спасибо!
определения раскладки клавиатуры или языка ОС »
Определения раскладки клавиатуры и языковых параметров ОС
OutFile "LocaleINFO.exe"
Name "Detect User Locale INFO"
Caption "Detect User Locale INFO"
!define LOCALE_ILANGUAGE '0x1' ;System Language Resource ID
!define LOCALE_SLANGUAGE '0x2' ;System Language & Country [Cool]
!define LOCALE_SABBREVLANGNAME '0x3' ;System abbreviated language
!define LOCALE_SNATIVELANGNAME '0x4' ;System native language name [Cool]
!define LOCALE_ICOUNTRY '0x5' ;System country code
!define LOCALE_SCOUNTRY '0x6' ;System Country
!define LOCALE_SABBREVCTRYNAME '0x7' ;System abbreviated country name
!define LOCALE_SNATIVECTRYNAME '0x8' ;System native country name [Cool]
!define LOCALE_IDEFAULTLANGUAGE '0x9' ;System default language ID
!define LOCALE_IDEFAULTCOUNTRY '0xA' ;System default country code
!define LOCALE_IDEFAULTCODEPAGE '0xB' ;System default oem code page
Function ".onInit"
System::Call 'kernel32::GetSystemDefaultLangID() i .r0'
System::Call 'kernel32::GetLocaleInfoA(i 1024, i ${LOCALE_SNATIVELANGNAME}, t .r1, i ${NSIS_MAX_STRLEN}) i r0'
System::Call 'kernel32::GetLocaleInfoA(i 1024, i ${LOCALE_SNATIVECTRYNAME}, t .r2, i ${NSIS_MAX_STRLEN}) i r0'
System::Call 'kernel32::GetLocaleInfoA(i 1024, i ${LOCALE_SLANGUAGE}, t .r3, i ${NSIS_MAX_STRLEN}) i r0'
MessageBox MB_OK|MB_ICONINFORMATION "Your System LANG Code is: $0. $\r$\nYour system language is: $1. $\r$\nYour system language is: $2. $\r$\nSystem Locale INFO: $3."
System::Call 'user32::GetKeyboardLayout(i 0)i.r0'
IntFmt $0 "%08x" $0
StrCpy $1 $0 "" -4
MessageBox MB_OK " Установленный по умолчанию DefaultLangID : $1 "
; 0409 - английский
; 0419 - русский
FunctionEnd
Section
SectionEnd
Раскладка клавиатуры по умолчанию - это раскладка, установленная в языковой панели, т.е. , которая будет после загрузки ОС
Не путать с текущей раскладкой, которая вышеприведённым кодом НЕ определяется !
С логикой "если бы, да кабы" - разберёшься сам. Примеров тьма.
wolkow70
23-11-2013, 20:21
Возник такой вопрос.
известно, что в Windows 8 для внесения ассоциации недостаточно добавить значение ProgId:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pdf\UserChoice]
"ProgId"="AcroExch.Document"
а требуется еще внести параметр Hash, вот так:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pdf\UserChoice]
"Hash"="xh8KhPWlZL0="
"ProgId"="AcroExch.Document"
Возник вопрос, можно ли в автоматическом режиме вычислить Hash значение параметра ProgID для записи в параметр Hash ?
Vincent7
24-11-2013, 00:48
Подскажите пожалуйста как можно отправить сообщение в командную строку? И можно ли в ней же эмулировать нажатие клавиши enter?
Подскажите пожалуйста как можно отправить сообщение в командную строку? И можно ли в ней же эмулировать нажатие клавиши enter? »
Как эмулировать нажатие клавиши
!include "WinMessages.nsh"
Caption "PressKey.exe"
OutFile "PressKey.exe"
Function .onInit
FindWindow $0 "ConsoleWindowClass" "Администратор: $SYSDIR\cmd.exe"
IsWindow $0 0 +2
MessageBox MB_OK "ОКНО НАЙДЕНО" idok +3
MessageBox MB_OK "ОКНО НЕ НАЙДЕНО"
quit
SendMessage $0 ${WM_CHAR} "0x0D" "0"
quit
FunctionEnd
Section
SetAutoClose true
SectionEnd
ConsoleWindowClass - класс окна, в котором собираемся сделать нажатие кнопки, не помню, такой же класс в WinXP у консоли или нет, лень проверять, как-нибудь сами
Администратор: $SYSDIR\cmd.exe - имя окна, если собираетесь жать в консоли, то лучше бы заранее в cmd-файле прописать "title" окна, т.к. например, в XP слово "Администратор" не добавляется к заголовку cmd окон как в Win7
0x0D - клавиша, которая отправляется окну. Коды читайте здесь: Virtual-Key Codes (http://msdn.microsoft.com/ru-ru/library/windows/desktop/dd375731(v=vs.85).aspx)
Насчет отправки сообщения в консоль не знаю, с консолью особо не было нужды работать, возможно, Вячеслав вам подскажет :)
Vincent7
25-11-2013, 16:22
не работает эмулирование... а если использовать execdos плагин с параметром /DETAILED- так информация из командной сроки будет выводится в окне установки, можно ли будет в это окно послать сообщение? будет ли оно воспринято консолью?
можно ли будет в это окно послать сообщение? будет ли оно воспринято консолью? »
Не совсем яcно чего ты хочешь и зачем такие извращения ?..
А в консольное окно, отправить нечто можно так :
outfile consol.exe
Section
System::Call 'kernel32::AllocConsole(i -1)'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $0 "hello, Vincent7 !"
SectionEnd
Проверял только на XP. На других ОС наверное надо вызывать AttachConsole... Не пробовал.
не работает эмулирование... »
:o а вы тестировали?
Хотите сказать, мой предоставленный код не рабочий? Может, вы делаете что-то не так?
Смотрите прикреплённый файл. Специально для вас, запустил виртуалку и проверил на XP (не, ну мало ли, чтобы уж наверняка)
C другим софтом да, возможно и не будет работать, но в командную строку лично у меня нажатие клавишь отправляет корректно
Кто-нибудь, протестите мой пример кода (http://forum.oszone.net/post-2260712-788.html) и скажите, работает ли у вас посылка нажатия "enter" в командную строку
можно ли будет в это окно послать сообщение? будет ли оно воспринято консолью? »
Мы вам тут сейчас кучу кода предоставим, а вы на всё будете отвечать "не работает"
Проверял только на XP. На других ОС наверное надо вызывать AttachConsole... Не пробовал. »
В Win7 x32 работает, правда открывает новое cmd окно, но если так и задуманно...о командах не читал, с консолью не работаю и не разбирался :)
Vincent7
27-11-2013, 15:28
Ну да,нажатие работает,извините моя ошибка. однако в моем коде нужно чтобы нажатие эмулировалось во время выполнения консольной программы, а не после
section "f"
ExecCmd::exec /TEST '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\Games' "D:\h"
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
IsWindow 0 +2
MessageBox MB_OK "Founded" idok +3
MessageBox MB_OK "not Founded"
quit
SendMessage $0 ${WM_CHAR} "0x0D" "0"
quit
sectionend
однако в моем коде нужно чтобы нажатие эмулировалось во время выполнения консольной программы, а не после »
Ну так...А в чем проблема прочитать описание плагина, которым пользуетесь?
И как вы копировали мой код, если удалили из команды нужную переменную?
IsWindow 0 +2
IsWindow $0 0 +2
ASYNC
Does not wait for process exit. Use 'wait' call if you want to get exit code. (/NOUNLOAD is mandatory!)
ExecCmd::exec /NOUNLOAD /ASYNC /TEST '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\Games' "D:\h"
Ваш процесс будет запущен параллельно установщику, а там уже определяйте по поиску окна с циклом, завершился он или нет как вариант...
ExecCmd::exec /NOUNLOAD /ASYNC /TEST '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\Games' "D:\h"
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
IsWindow $0 0 -1
stSend:
sleep 1000
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
IsWindow $0 0 noWindow
SendMessage $0 ${WM_CHAR} "0x0D" "0"
goto stSend
noWindow:
Указанный выше код будет постоянно посылать окну нажатие кнопки с интервалом в 1 секунду, пока окно существует
И, если вы хотите, чтобы ваш код с командной строкой работал на всех системах, я вам уже говорил в отличии заголовков окон в WinXP и Win7 (в Win8 не помню как), так что вам сначала нужно определить ОС и в зависимости + типа учетной записи менять искомый заголовок командной строки...
Лень сейчас писать вам код, подумайте хоть чуток сами...
Определяем ОС
Определяем тип учетки
Если значение билда ОС выше 5 (WinXP 5.1) И тип учетки админ - в переменную заголовка кидаем текст с приставкой "Администратор"
Я с командной строкой не работал, ещё раз повторюсь, возможно, это и не нужно...Поправьте меня, если кто тесно работал с командной строкой
Vincent7
27-11-2013, 17:52
спасибо большое!
Vincent7
28-11-2013, 00:43
С этим разобрался. Теперь нужно считать информацию из командной сроки... Как? :)
Теперь нужно считать информацию из командной сроки... Как? »
Как я понял, в этой теме с командной строкой так тесно никто не работал, да и заявленные вами функции весьма сомнительны, так что вряд ли здесь кто-то будет гуглить команды за вас и пытаться их использовать в скрипте NSIS.
Умеете пользоваться поиском? Ищите команды для работы с консолью типа тех, что вам дал MKN, а то тут получается, что ваших кодов ещё никто не видел, а готовые решения получаете
Я, например, чтобы считать все данные из консольного приложения (оно выполняется и отображает прогресс действий строками) пользуюсь плагином ExecDos plug-in (http://nsis.sourceforge.net/ExecDos_plug-in), который позволяет в качестве выходных данных указать функцию, которая будет получать каждую строчку из консольного приложения в момент его выполнения либо HANDLE, в который будут посылаться данные.
Пример по выходным данным в фунцкию смотрите на страничке описания плагина внизу странички (ключ /TOFUNC)
Дальше пробуйте и разбирайтесь сами, если что не получится - пишите и показывайте, как вы пробовали реализовать нужный вам функционал.
И не забудьте прочитать Справочник по NSIS (http://forum.oszone.net/thread-168287.html)
нужно считать информацию из командной сроки... Как? »
Почему ты так мутно ставишь вопросы... Задача должна быть поставлена чётко и с ясной целью.
Из какой такой строки ? Если из команды из скрипта, то например, с помощью плагина http://nsis.sourceforge.net/ExecCmd_plug-in
Можно с открытой, можно со скрытой консолью. Только зачем вообще нужно окно консоли ? Там что то надо дополнительно делать ?
Если из введённой тобой внешней команды ( опять же, смотря откуда вводить - из консоли, из строки ввода в окне твоего инсталлятора, или вообще из какого либо иного приложения и т.д. ) - тут иной расклад, но тоже решаемый...
Vincent7
29-11-2013, 15:27
окно консоли нужно чтобы эмулировать нажатие кнопки и посылать туда данные. Разве со скрытой командной строкой такое возможно?
окно консоли нужно чтобы эмулировать нажатие кнопки и посылать туда данные. »
Вы вот тут пишите своими загадками, а лично я не понимаю, чего вы в итоге хотите добиться, какой функционал вам нужно реализовать?
Зачем эмулировать нажатие клавиши в консоли?
Зачем посылать данные в командную строку?
Если вы бы с самого начала описали, что имеете в наличии (программы/средства и т.д.) и что конкртено со всем этим нужно сделать - мы бы уже сидели и думали, как это реализовать, так проще, поверьте, чем по кускам пытаться набросать код сомнительного функционала...
Разве со скрытой командной строкой такое возможно? »
Если вы не видите окна - это не означает, что его не существует
Звучит, конечно, глупо, но для программирования - это норма :biggrin:
!include "WinMessages.nsh"
Caption "PressKey.exe"
OutFile "PressKey.exe"
Function .onInit
# Украденный код у MKN start
System::Call 'kernel32::AllocConsole(i -1)'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
# Украденный код у MKN end
FindWindow $1 "ConsoleWindowClass" "$EXEPATH"
IsWindow $1 0 -1
FileWrite $0 "TEST started...hide window after 3 seconds"
Sleep 3000
ShowWindow $1 0
FileWrite $0 "$\n$\n$\n$\n================= Hello, Vincent7 !!! ================="
FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
FileWrite $0 "$\n$\nwindow is shown after 3 seconds"
FileWrite $0 "$\nthis test will close after 10 seconds..."
Sleep 3000
ShowWindow $1 1
StrCpy $2 11
st:
intop $2 $2 - 1
StrCmp $2 -1 endtest 0
FileWrite $0 "$\n$\t$\t$\t$2..."
Sleep 1000
goto st
endtest:
MessageBox MB_OK|MB_ICONINFORMATION "Тест завершен"
quit
FunctionEnd
Section
SetAutoClose true
SectionEnd
Vincent7,
зачем изнасиловать командную строку ? может есть более легкий способ решения твоей задачи ? :unsure:
уважаемые, подскажите как присвоить файлу атрибут "скрытый" после его создания?
пример взят из хелпа:
FileOpen $0 "$EXEDIR\kav_temp.txt" w
# Создаём файл в необходимом месте
# Записываем нужную информацию
FileWrite $0 "OSZone.net $\r$\n" ; Первая строка в файле
FileWrite $0 "Это пример от K.A.V. $\r$\n" ; Вторая строка в файле
FileWrite $0 "$\r$\n" ; Третяя строка в файле (пустая)
FileWrite $0 "Данный пример взят из 'Справочника по NSIS'$\r$\n" ; Четвёртая строка в файле
FileClose $0
# Закрываем файл
и ещё, что означает "w" в строке
FileOpen $0 "$EXEDIR\kav_temp.txt" w
и какие другие параметры существуют?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.