|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9] |
|
Скрипты Inno Setup. Помощь и советы [часть 9]
|
Ветеран Сообщения: 1270 |
Профиль | Отправить PM | Цитировать
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме Inno Setup. Прочие вопросы. Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах: Скрипты Inno Setup. Помощь и советы [часть 6] | Скрипты Inno Setup. Помощь и советы [часть 6].7z Скрипты Inno Setup. Помощь и советы [часть 7] | Скрипты Inno Setup. Помощь и советы [часть 7].7z Скрипты Inno Setup. Помощь и советы [часть 8] | Скрипты Inno Setup. Помощь и советы [часть 8].7z |
|
Отправлено: 16:09, 04-04-2018 |
Пользователь Сообщения: 94
|
Профиль | Отправить PM | Цитировать Цитата DA-Bro:
Цитата DA-Bro:
Константа появилась с версии 6.1.0 (читать). До этого она была {fonts}. Как правильно устанавливать шрифты - читать. |
||
Отправлено: 16:37, 24-08-2024 | #1091 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 98
|
Профиль | Отправить PM | Цитировать Flix, ну да, пробовал в версии Inno Setup 6.0.5, там же в справке и смотрел.
Тут всё теперь понятно. Так в моём случае получается {commonfonts} и {fonts} одно и тоже? Или как. |
Отправлено: 17:14, 24-08-2024 | #1092 |
Пользователь Сообщения: 94
|
Профиль | Отправить PM | Цитировать Цитата DA-Bro:
Если используете версию Inno ниже 6.1.0, то указываете {fonts}. Если выше 6.1.0 - то {commonfonts}, но с учетом 10 версии винды и выше, а также привилегий, могут быть варианты с {userfonts} и {autofonts}. Если не имеете понятия про версию винды и права пользователя, то рекомендуется использовать константу {autofonts}. |
|
Отправлено: 18:01, 24-08-2024 | #1093 |
Новый участник Сообщения: 42
|
Профиль | Отправить PM | Цитировать Цитата El Sanchez:
я думал это редирект а оказалось это просто отдельный раздел для 64биток. Я также исследовал редиректы внутренние, но это не помогло. А также я выяснил что не может читать только с HKEY_LOCAL_MACHINE, а вот с HKEY_CURRENT_USER без проблем читает. Поэтому я решил пойти другим путем и определить путь игры через Steam. Вышло даже лучше чем я хотел - я определяю еще и диск (ведь игру можно в либе переместить на другой том)
получилось очень даже хорошо и мой динамический установщик кайфово отпрабатывает и готов к любым обновлениям версий и тому что там разработчик может изменить. Т.е. мой Inno Setup проверяет только наличие стима и флага что игра установлена (так как всё это для одной игры требуется), а вот путь где установлено, построение конфигов и всё остальное я чекаю через скрипты |
|
Отправлено: 22:41, 04-09-2024 | #1094 |
Пользователь Сообщения: 67
|
Профиль | Отправить PM | Цитировать дал мне когда то форумчанин по имени Gnom_aka_Lexander отличный визуал скрипт. подредактировал я этот скрипт немножко под себя - и восторгу моему не было предела. вот спустя годы возникла нужда в написании setup.exe, достал я значит заготовку, и смастерил инсталлятор. запускаю, а картинка в форме не на весь экран
думаю в чем дело, все ж нормально было, пробую старый проект - такая же картина. оказалось дело в том, что у меня стоит увеличения текста в Windows (изменение размера текста, приложений и других элементов свыше 100%). походил я по интернету, и нашел решение, откат на версию 5.1.9 конца 2006 года, но и тут меня ждала небольшая засада, рамки вокруг надписей
как заставить это работать правильно, на более новых версиях Inno, может есть какое дополнение (библиотека), или версия Inno, по типу (advanced)?
в дополнение: нужно решить еще две проблемы, чтобы довести скрипт до ума. 1.) найти способ перетаскивать форму при (BorderStyle:=bsNone). код
[Setup]
AppName=Test AppVerName=Test OutputBaseFilename=Test OutputDir=userdocs:..\desktop CreateAppDir=no Uninstallable=no [code] procedure InitializeWizard(); var ClientWidth: Integer; ClientHeight: Integer; begin ClientWidth := WizardForm.ClientWidth; ClientHeight := WizardForm.ClientHeight; WizardForm.BorderStyle := bsNone; WizardForm.ClientWidth := ClientWidth; WizardForm.ClientHeight := ClientHeight; end; вторую неделю уже колдую, и все ни как . в принципе жить можно, но вот перетащить форму очень бы хотелось. |
Последний раз редактировалось Beavimo, 20-10-2024 в 01:57. Отправлено: 01:38, 09-10-2024 | #1095 |
Ветеран Сообщения: 1270
|
Профиль | Отправить PM | Цитировать Цитата Beavimo:
Скрытый текст
[Files] #ifndef IS_ENHANCED #if VER < 0x06000000 ; https://web.archive.org/web/20150510131335if_/http://restools.hanzify.org/inno/callbackctrl/InnoCallbackCtrl_V1.1.zip Source: CallbackCtrl.dll; Flags: dontcopy #endif #endif [Code] const WH_KEYBOARD = 2; VK_LBUTTON = $0001; WM_SETCURSOR = $0020; WM_LBUTTONDOWN = $0201; HTCLIENT = 1; SWP_NOSIZE = 1; SWP_NOZORDER = 4; SWP_NOOWNERZORDER = $0200; // CallbackCtrl.dll Functions #ifndef IS_ENHANCED #if VER < 0x06000000 type TKeyboardProc = function(nCode: Integer; wParam: UINT_PTR; lParam: INT_PTR): Longint; TSubclassProc = function(hWnd: HWND; uMsg: UINT; wParam: UINT_PTR; lParam: INT_PTR; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): INT_PTR; function WrapKeyboardProc(Callback: TKeyboardProc; ParamCount: Integer): LongWord; external 'wrapcallbackaddr@files:callbackctrl.dll stdcall'; function WrapSubclassProc(Callback: TSubclassProc; ParamCount: Integer): LongWord; external 'wrapcallbackaddr@files:callbackctrl.dll stdcall'; #endif #endif // Process and Thread Functions function GetCurrentThreadId(): DWORD; external 'GetCurrentThreadId@kernel32.dll stdcall'; // Hook Functions function CallNextHookEx(hhk: THandle; nCode: Integer; wParam: UINT_PTR; lParam: INT_PTR): INT_PTR; external 'CallNextHookEx@user32.dll stdcall'; function SetWindowsHookEx(idHook: Integer; lpfn: LongWord; hmod: THandle; dwThreadId: DWORD): THandle; external 'SetWindowsHookExW@user32.dll stdcall'; function UnhookWindowsHookEx(hhk: THandle): BOOL; external 'UnhookWindowsHookEx@user32.dll stdcall'; // Shell Functions function SetWindowSubclass(hWnd: HWND; pfnSubclass: LongWord; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): BOOL; external 'SetWindowSubclass@comctl32.dll stdcall'; function RemoveWindowSubclass(hWnd: HWND; pfnSubclass: LongWord; uIdSubclass: UINT_PTR): BOOL; external 'RemoveWindowSubclass@comctl32.dll stdcall'; function DefSubclassProc(hWnd: HWND; uMsg: UINT; wParam: UINT_PTR; lParam: INT_PTR): INT_PTR; external 'DefSubclassProc@comctl32.dll stdcall'; // Cursor Functions function GetCursorPos(out lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall'; // Window Functions function GetWindowRect(hWnd: HWND; out lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall'; function SetWindowPos(hWnd, hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall'; // Keyboard Input Functions function GetAsyncKeyState(vKey: Integer): SmallInt; external 'GetAsyncKeyState@user32.dll stdcall'; // Rectangle Functions function OffsetRect(var lprc: TRect; dx, dy: Integer): BOOL; external 'OffsetRect@user32.dll stdcall'; var HHookProc: THandle; PKeyboardProc: LongWord; PWndProc: LongWord; function WndProc(hWnd: HWND; uMsg: UINT; wParam: UINT_PTR; lParam: INT_PTR; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): INT_PTR; var LWindowRect: TRect; LSavePt, LCurPt: TPoint; begin case uMsg of WM_SETCURSOR: begin Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); if (lParam shr $10 = WM_LBUTTONDOWN) and (lParam and $FFFF = HTCLIENT) then begin GetWindowRect(hWnd, LWindowRect); GetCursorPos(LSavePt); while (GetAsyncKeyState(VK_LBUTTON) <> 0) do begin GetCursorPos(LCurPt); OffsetRect(LWindowRect, LCurPt.x - LSavePt.x, LCurPt.y - LSavePt.y); SetWindowPos(hWnd, 0, LWindowRect.Left, LWindowRect.Top, 0, 0, SWP_NOOWNERZORDER or SWP_NOSIZE or SWP_NOZORDER); LSavePt := LCurPt; end; end; end; else Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); end; end; procedure SubclassWizardForm(const ARemove: Boolean); begin if PWndProc = 0 then #ifdef IS_ENHANCED PWndProc := CallbackAddr('WndProc'); #elif VER >= 0x06000000 PWndProc := CreateCallback(@WndProc); #else PWndProc := WrapSubclassProc(@WndProc, 6); #endif if not ARemove then SetWindowSubclass(WizardForm.Handle, PWndProc, 0, 0) else if PWndProc <> 0 then RemoveWindowSubclass(WizardForm.Handle, PWndProc, 0); end; function KeyboardProc(nCode: Integer; wParam: UINT_PTR; lParam: INT_PTR): Longint; begin if nCode < 0 then Result := CallNextHookEx(HHookProc, nCode, wParam, lParam) else Result := 1; end; procedure SetHook(); begin if PKeyboardProc = 0 then #ifdef IS_ENHANCED PKeyboardProc := CallbackAddr('KeyboardProc'); #elif VER >= 0x06000000 PKeyboardProc := CreateCallback(@KeyboardProc); #else PKeyboardProc := WrapKeyboardProc(@KeyboardProc, 3); #endif HHookProc := SetWindowsHookEx(WH_KEYBOARD, PKeyboardProc, 0, GetCurrentThreadId()); end; procedure UnHook(); begin if HHookProc > 0 then UnhookWindowsHookEx(HHookProc); end; procedure InitializeWizard; begin WizardForm.BorderStyle := bsNone; SetHook(); SubclassWizardForm(False); end; procedure DeinitializeSetup(); begin SubclassWizardForm(True); UnHook(); end; |
|
Отправлено: 13:23, 16-10-2024 | #1096 |
Пользователь Сообщения: 67
|
Профиль | Отправить PM | Цитировать El Sanchez, дружище только увидел твой пост - думал это невозможно Я перелопатил весь интернет в поисках решения, но так ничего и не нашел, а тут такое Наконец осуществилась моя мечта, иметь на борту достойный инсталлятор. СПАСИБИЩЕ ТЕБЕ БОЛЬШОЕ!!! |
Последний раз редактировалось Beavimo, 18-10-2024 в 19:19. Отправлено: 16:19, 18-10-2024 | #1097 |
Пользователь Сообщения: 67
|
Профиль | Отправить PM | Цитировать Доброго дня Форумчане есть у меня вот такой код
[Setup] AppName=Test AppVerName=Test OutputBaseFilename=Test OutputDir=userdocs:..\desktop DefaultDirName=Test Uninstallable=no [code] const VK_LBUTTON = $0001; WM_SETCURSOR = $0020; WM_LBUTTONDOWN = $0201; HTCLIENT = 1; SWP_NOSIZE = 1; SWP_NOZORDER = 4; SWP_NOOWNERZORDER = $0200; function SetWindowSubclass(hWnd: HWND; pfnSubclass: LongWord; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): BOOL; external 'SetWindowSubclass@comctl32.dll stdcall'; function RemoveWindowSubclass(hWnd: HWND; pfnSubclass: LongWord; uIdSubclass: UINT_PTR): BOOL; external 'RemoveWindowSubclass@comctl32.dll stdcall'; function DefSubclassProc(hWnd: HWND; uMsg: UINT; wParam: UINT_PTR; lParam: INT_PTR): INT_PTR; external 'DefSubclassProc@comctl32.dll stdcall'; function GetCursorPos(out lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall'; function GetWindowRect(hWnd: HWND; out lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall'; function SetWindowPos(hWnd, hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall'; function GetAsyncKeyState(vKey: Integer): SmallInt; external 'GetAsyncKeyState@user32.dll stdcall'; function OffsetRect(var lprc: TRect; dx, dy: Integer): BOOL; external 'OffsetRect@user32.dll stdcall'; var PWndProc: LongWord; function WndProc(hWnd: HWND; uMsg: UINT; wParam: UINT_PTR; lParam: INT_PTR; uIdSubclass: UINT_PTR; dwRefData: DWORD_PTR): INT_PTR; var LWindowRect: TRect; LSavePt, LCurPt: TPoint; begin case uMsg of WM_SETCURSOR: begin Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); if (lParam shr $10 = WM_LBUTTONDOWN) and (lParam and $FFFF = HTCLIENT) then begin GetWindowRect(hWnd, LWindowRect); GetCursorPos(LSavePt); while (GetAsyncKeyState(VK_LBUTTON) <> 0) do begin GetCursorPos(LCurPt); OffsetRect(LWindowRect, LCurPt.x - LSavePt.x, LCurPt.y - LSavePt.y); SetWindowPos(hWnd, 0, LWindowRect.Left, LWindowRect.Top, 0, 0, SWP_NOOWNERZORDER or SWP_NOSIZE or SWP_NOZORDER); LSavePt := LCurPt; end; end; end; else Result := DefSubclassProc(hWnd, uMsg, wParam, lParam); end; end; procedure SubclassWizardForm(const ARemove: Boolean); begin if PWndProc = 0 then PWndProc := CreateCallback(@WndProc); if not ARemove then SetWindowSubclass(WizardForm.Handle, PWndProc, 0, 0) else if PWndProc <> 0 then RemoveWindowSubclass(WizardForm.Handle, PWndProc, 0); end; procedure TButtonOnClick( Sender: TObject ); var MainForm: TSetupForm; begin begin MainForm := CreateCustomForm(); with MainForm do try BorderIcons := []; ClientWidth := ScaleX( 300 ); ClientHeight := ScaleY( 300 ); Caption := 'Информация'; //Position := poScreenCenter; Position := poMainFormCenter with TBevel.Create( nil ) do begin Parent := MainForm; SetBounds( ScaleX( 8 ), ScaleY( 8 ), ScaleX( 284 ), ScaleY( 249 ) ); Shape := bsFrame; end; with TNewStaticText.Create( nil ) do begin Parent := MainForm; SetBounds( ScaleX( 12 ), ScaleY( 12 ), ScaleX( 276 ), ScaleY( 241 ) ); AutoSize := False; Caption := 'Информация:' + #13#10 + 'Версия:' + #13#10 + 'И т.д.'; WordWrap := True; end; with TButton.Create( nil ) do begin Parent := MainForm; SetBounds( ScaleX( 112 ), ScaleY( 266 ), ScaleX( 76 ), ScaleY( 25 ) ); ModalResult := mrOk; Caption := 'Закрыть'; end; ShowModal(); finally Free; end; end; end; procedure InitializeWizard(); begin with TButton.Create( nil ) do begin Parent := WizardForm; Left := ScaleX( 12 ); Top := ScaleY( 327 ); Caption := 'Info'; OnClick := @TButtonOnClick; end; begin SubclassWizardForm(False); end; end; и вот стоит у меня несколько задач по данному примеру. 1.) Непонятно почему форма перетаскивается, а окно информации нет? 2.) Почему окно информации открывается не по центру формы? 3.) Возможно ли сделать так, чтобы окно информации закрывалось кликом по нему? ответьте пожалуйста, может нету вариантов решения. скоро месяц как я живу в этой программе, много чего нового нашел, много чего склеил, но некоторые вопросы решить сам не могу, так как не силён. просто реально у меня уже нету сил, в сумме на этот проект я потратил около полугода, и хочется добить его уже наконец до конца. что само больше раздражает, что мелочи которые раньше гуглились на раз, сейчас с фонарем не сыщешь, а старый комп с примерами в другом месте. весь интернет засран чекбоксами. репакеры мне (зачем музыка в инсталяторе???????????) слов нету на таких дибилов. |
Последний раз редактировалось Beavimo, 24-10-2024 в 10:08. Отправлено: 09:49, 24-10-2024 | #1098 |
Пользователь Сообщения: 67
|
Профиль | Отправить PM | Цитировать люди помогите
у меня уже чердак дымит. я весь вымотался |
Отправлено: 13:08, 24-10-2024 | #1099 |
Ветеран Сообщения: 860
|
Профиль | Отправить PM | Цитировать Beavimo, имейте терпение. Знающие люди придут с работы и помогут чем смогут.
|
------- Отправлено: 13:16, 24-10-2024 | #1100 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Скрипты Inno Setup. Помощь и советы [часть 7] | El Sanchez | Автоматическая установка приложений | 2499 | 02-02-2015 08:59 | |
Скрипты Inno Setup. Помощь и советы [часть 6] | El Sanchez | Автоматическая установка приложений | 2494 | 10-03-2014 11:51 | |
Скрипты Inno Setup. Помощь и советы [часть 5] | El Sanchez | Автоматическая установка приложений | 1999 | 28-03-2013 19:09 | |
Скрипты Inno Setup. Помощь и советы [часть 4] | El Sanchez | Автоматическая установка приложений | 2099 | 22-05-2012 23:16 | |
Скрипты Inno Setup. Помощь и советы [часть 3] | Serega | Автоматическая установка приложений | 3755 | 26-10-2011 17:58 |
|