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
21-11-2013, 10:34
Ещё раз о запрете перетаскивания окон-страниц.
Китайские "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 Васюки.... :)

K.A.V.
21-11-2013, 11:27
Не уверен, что так корректно, но работает... И ещё нигде не нашёл инфы о константе(?) 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
Можно пример скрипта определения раскладки клавиатуры или языка ОС, и если он англ. - завершение работы скрипта. Спасибо!

MKN
21-11-2013, 13:15
определения раскладки клавиатуры или языка ОС »

Определения раскладки клавиатуры и языковых параметров ОС


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?

K.A.V.
24-11-2013, 07:42
Подскажите пожалуйста как можно отправить сообщение в командную строку? И можно ли в ней же эмулировать нажатие клавиши 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- так информация из командной сроки будет выводится в окне установки, можно ли будет в это окно послать сообщение? будет ли оно воспринято консолью?

MKN
25-11-2013, 18:11
можно ли будет в это окно послать сообщение? будет ли оно воспринято консолью? »
Не совсем я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... Не пробовал.

K.A.V.
26-11-2013, 20:47
не работает эмулирование... »
: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

K.A.V.
27-11-2013, 16:37
однако в моем коде нужно чтобы нажатие эмулировалось во время выполнения консольной программы, а не после »
Ну так...А в чем проблема прочитать описание плагина, которым пользуетесь?

И как вы копировали мой код, если удалили из команды нужную переменную?
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
С этим разобрался. Теперь нужно считать информацию из командной сроки... Как? :)

K.A.V.
29-11-2013, 07:55
Теперь нужно считать информацию из командной сроки... Как? »
Как я понял, в этой теме с командной строкой так тесно никто не работал, да и заявленные вами функции весьма сомнительны, так что вряд ли здесь кто-то будет гуглить команды за вас и пытаться их использовать в скрипте NSIS.
Умеете пользоваться поиском? Ищите команды для работы с консолью типа тех, что вам дал MKN, а то тут получается, что ваших кодов ещё никто не видел, а готовые решения получаете

Я, например, чтобы считать все данные из консольного приложения (оно выполняется и отображает прогресс действий строками) пользуюсь плагином ExecDos plug-in (http://nsis.sourceforge.net/ExecDos_plug-in), который позволяет в качестве выходных данных указать функцию, которая будет получать каждую строчку из консольного приложения в момент его выполнения либо HANDLE, в который будут посылаться данные.
Пример по выходным данным в фунцкию смотрите на страничке описания плагина внизу странички (ключ /TOFUNC)
Дальше пробуйте и разбирайтесь сами, если что не получится - пишите и показывайте, как вы пробовали реализовать нужный вам функционал.
И не забудьте прочитать Справочник по NSIS (http://forum.oszone.net/thread-168287.html)

MKN
29-11-2013, 12:47
нужно считать информацию из командной сроки... Как? »
Почему ты так мутно ставишь вопросы... Задача должна быть поставлена чётко и с ясной целью.
Из какой такой строки ? Если из команды из скрипта, то например, с помощью плагина http://nsis.sourceforge.net/ExecCmd_plug-in
Можно с открытой, можно со скрытой консолью. Только зачем вообще нужно окно консоли ? Там что то надо дополнительно делать ?
Если из введённой тобой внешней команды ( опять же, смотря откуда вводить - из консоли, из строки ввода в окне твоего инсталлятора, или вообще из какого либо иного приложения и т.д. ) - тут иной расклад, но тоже решаемый...

Vincent7
29-11-2013, 15:27
окно консоли нужно чтобы эмулировать нажатие кнопки и посылать туда данные. Разве со скрытой командной строкой такое возможно?

K.A.V.
29-11-2013, 16:08
окно консоли нужно чтобы эмулировать нажатие кнопки и посылать туда данные. »
Вы вот тут пишите своими загадками, а лично я не понимаю, чего вы в итоге хотите добиться, какой функционал вам нужно реализовать?

Зачем эмулировать нажатие клавиши в консоли?
Зачем посылать данные в командную строку?

Если вы бы с самого начала описали, что имеете в наличии (программы/средства и т.д.) и что конкртено со всем этим нужно сделать - мы бы уже сидели и думали, как это реализовать, так проще, поверьте, чем по кускам пытаться набросать код сомнительного функционала...

Разве со скрытой командной строкой такое возможно? »
Если вы не видите окна - это не означает, что его не существует
Звучит, конечно, глупо, но для программирования - это норма :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

vahe-91
29-11-2013, 16:43
Vincent7,
зачем изнасиловать командную строку ? может есть более легкий способ решения твоей задачи ? :unsure:

vosya
30-11-2013, 18:30
уважаемые, подскажите как присвоить файлу атрибут "скрытый" после его создания?

пример взят из хелпа:


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