|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9] |
|
Скрипты Inno Setup. Помощь и советы [часть 9]
|
Ветеран Сообщения: 1269 |
Профиль | Отправить 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 |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Та я вроде не играю в Павлика Морозова.
четко сказал что нужно в инсталляторе прочитать свойство файла (Описание файла). |
Отправлено: 19:57, 08-04-2022 | #761 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать Цитата ivan_rolos:
Ну, или сами дальше тогда... |
|
Отправлено: 20:55, 08-04-2022 | #762 |
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать |
Отправлено: 21:33, 08-04-2022 | #763 |
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать Коллеги, всем доброго времени суток!
Подскажите пожалуйста, есть ли решение, как заменить иконку в MsgBox вместо mbError, mbInformation, и т.д. на свою, другую иконку, которая будет браться из системных файлов Windows? Заранее, спасибо. |
Отправлено: 15:19, 30-05-2022 | #764 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Vanadiy777,
В WinAPI есть функция MessageBoxIndirect, которая позволяет использовать произвольный значок. Здесь на форуме есть её реализация (ссылка), но неполная -- требуется небольшой допилинг для загрузки своего значка. |
Отправлено: 15:30, 31-05-2022 | #765 |
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать iglezz, спасибо, буду изучать...
Правда не уверен, что получится, для меня сложновато... |
Отправлено: 18:06, 31-05-2022 | #766 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Vanadiy777,
Поковырял тот образец, удалось в MessageBoxIndirect отобразить значок из 32/64-бит PE-файла (dll/exe/icl). ico использовать нельзя. Пример смогу выложить позже, т.к. код ещё причесать надо. |
Последний раз редактировалось iglezz, 10-06-2022 в 16:10. Отправлено: 20:19, 31-05-2022 | #767 |
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать Цитата iglezz:
Мне надо взять два разных значка из одной системной dll, и в зависимости от события вывести этот значок в MsgBox. |
|
Отправлено: 20:57, 31-05-2022 | #768 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать В итоге получилать такая матрёшка...
Функция MsgBoxEx (на базе MessageBoxIndirect) может служить полной заменой стандартному MsgBox. MsgBoxEx('Сообщение', 'Заголовок', 0, ЗНАЧОК, ФЛАГИ) - стандартный значок MsgBoxEx('Сообщение', 'Заголовок', '', ЗНАЧОК, ФЛАГИ) - значок из установщика MsgBoxEx('Сообщение', 'Заголовок', 'ФАЙЛ', ЗНАЧОК, ФЛАГИ) - значок из 32/64-бит PE-файла (exe/dll/icl/...) В константах IDI_SHIELD и IDI_APPLICATION два новых значка. ЗНАЧОК задаётся константой MB_ICON*, IDI_* либо числом, либо 'строкой' ('MAINICON'). Если файл со значком открыть не удаётся, то устанавливается значок IDI_APPLICATION Коды возврата, флаги, стандартные значки MB_ICON* соответствуют стандартному месседжбоксу. пример.iss
#define APPNAME "MessageBoxIndirect test" [Setup] AppName={#APPNAME} AppVersion=0.1 DisableWelcomePage=yes DefaultDirName={tmp}\{#APPNAME} OutputDir=. OutputBaseFilename={#APPNAME} PrivilegesRequired=lowest [code] #include 'WinAPI_MessageBoxIndirect.pas' procedure initializeWizard(); var dllname: String; ret: Integer; begin // Standard icons: MsgBox('std mbInformation', mbInformation, MB_OK); MsgBoxEx('ex IDI_INFORMATION', '{#APPNAME}', 0, IDI_INFORMATION, MB_OK); MsgBox('std mbConfirmation', mbConfirmation, MB_OK); MsgBoxEx('ex IDI_QUESTION', '{#APPNAME}', 0, IDI_QUESTION, MB_OK); MsgBox('std mbError', mbError, MB_OK); MsgBoxEx('ex IDI_EXCLAMATION', '{#APPNAME}', 0, IDI_EXCLAMATION, MB_OK); MsgBox('std mbCriticalError', mbCriticalError, MB_OK); MsgBoxEx('ex IDI_ERROR', '{#APPNAME}', 0, IDI_ERROR, MB_OK); MsgBoxEx('ex IDI_SHIELD', '{#APPNAME}', 0, IDI_SHIELD, MB_OK); MsgBoxEx('ex IDI_APPLICATION', '{#APPNAME}', 0, IDI_APPLICATION, MB_OK); // Icon from installer MsgBoxEx('Installer icon', '{#APPNAME}', '', 'MAINICON', MB_OK) // Icon from exe/dll file dllname := 'C:\Program Files\Totalcmd\TOTALCMD.EXE' MsgBoxEx('app icon (text)'#10'from'#10+dllname, '{#APPNAME}', dllname, 'MAINICON', MB_OK) MsgBoxEx('app icon (num)'#10'from'#10+dllname, '{#APPNAME}', dllname, 6, MB_OK) // Icon from exe/dll file. failed to load. MsgBoxEx('LoadLibrary error', '{#APPNAME}', 'x:\notexist', 'MAINICON', MB_OK) // Return code test loop dllname := 'C:\Windows\SysWOW64\shell32.dll' while true do begin ret := MsgBoxEx('icon from'#10+dllname, '{#APPNAME}', dllname, 337, MB_YESNOCANCEL or MB_DEFBUTTON2); case ret of IDYES: ret := MsgBoxEx('YES'#10#10'Continue?', '{#APPNAME}', dllname, 16802, MB_YESNO); IDNO: ret := MsgBoxEx('NO'#10#10'Continue?', '{#APPNAME}', dllname, 240, MB_YESNO); IDCANCEL: ret := MsgBoxEx('CANCEL'#10#10'Continue?', '{#APPNAME}', dllname, 142, MB_YESNO); end; if ret = IDNO then break; end; Abort; end; подключаемый WinAPI_MessageBoxIndirect.pas
#ifndef WinAPI_MessageBoxIndirect__pas #define WinAPI_MessageBoxIndirect__pas #include 'WinAPI.pas' #include 'WinAPILoader.pas' const // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox MB_CANCELTRYCONTINUE = $00000006; MB_ICONERROR = $00000010; MB_ICONSTOP = MB_ICONERROR; MB_ICONHAND = MB_ICONERROR; MB_ICONQUESTION = $00000020; MB_ICONWARNING = $00000030; MB_ICONEXCLAMATION = MB_ICONWARNING; MB_ICONINFORMATION = $00000040; MB_ICONASTERISK = MB_ICONINFORMATION; MB_USERICON = $00000080; // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadiconw IDI_APPLICATION = 32512; IDI_INFORMATION = 32516; IDI_ASTERISK = IDI_INFORMATION; IDI_ERROR = 32513; IDI_HAND = IDI_ERROR; IDI_WARNING = 32515; IDI_EXCLAMATION = IDI_WARNING; IDI_QUESTION = 32514; IDI_SHIELD = 32518; IDTRYAGAIN = 10; IDCONTINUE = 11; type // MSGBOXPARAMSW structure // https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-msgboxparamsw // lpszIcon - string type _WinAPI_tagMSGBOXPARAMS_S = record cbSize: UINT; hwndOwner: HWND; hInstance: HINST; lpszText: String; lpszCaption: String; dwStyle: DWORD; lpszIcon: String; dwContextHelpId: DWORD_PTR; lpfnMsgBoxCallback: Pointer; dwLanguageId: DWORD; end; // lpszIcon - numeric type _WinAPI_tagMSGBOXPARAMS_N = record cbSize: UINT; hwndOwner: HWND; hInstance: HINST; lpszText: String; lpszCaption: String; dwStyle: DWORD; lpszIcon: DWORD; dwContextHelpId: DWORD_PTR; lpfnMsgBoxCallback: Pointer; dwLanguageId: DWORD; end; // https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messageboxindirectw function _WinAPI_MessageBoxIndirect_S(const MsgBoxParams: _WinAPI_tagMSGBOXPARAMS_S): Integer; external 'MessageBoxIndirectW@user32.dll stdcall'; function _WinAPI_MessageBoxIndirect_N(const MsgBoxParams: _WinAPI_tagMSGBOXPARAMS_N): Integer; external 'MessageBoxIndirectW@user32.dll stdcall'; function MsgBoxExNI( const Text: String; const Caption: String; const hInstance: HINST; const IconNumber: DWORD; const Flags: DWORD ): Integer; var mp: _WinAPI_tagMSGBOXPARAMS_N; begin mp.cbSize := SizeOf(mp); mp.hInstance := hInstance; mp.lpszText := Text; mp.lpszCaption := Caption; if (IconNumber < IDI_APPLICATION) and (hInstance = 0) then mp.dwStyle := Flags or IconNumber else begin mp.dwStyle := Flags or MB_USERICON; mp.lpszIcon := IconNumber; end; Result := _WinAPI_MessageBoxIndirect_N(mp); end; function MsgBoxExSI( const Text: String; const Caption: String; const hInstance: HINST; const IconName: String; const Flags: DWORD ): Integer; var mp: _WinAPI_tagMSGBOXPARAMS_S; begin mp.cbSize := SizeOf(mp); mp.hInstance := hInstance; mp.lpszText := Text; mp.lpszCaption := Caption; mp.dwStyle := Flags or MB_USERICON; mp.lpszIcon := IconName; Result := _WinAPI_MessageBoxIndirect_S(mp); end; (* function MsgBoxEx Text: `Messagebox text` Caption: `Messagebox caption` IconSource: 0 -- standard icons: MB_ICON*, IDI_* : '' -- load icon from INSTALLER_EXE : 'FILE' -- load icon from FILE IconID: MB_ICON*, IDI_* -- if IconSource = 0 : <icon name/number> if IconSource = '*' Flags: MB_OK, MB_OKCANCEL, MB_ABORTRETRYIGNORE, MB_YESNOCANCEL, MB_YESNO, MB_RETRYCANCEL, MB_CANCELTRYCONTINUE, MB_DEFBUTTON1, MB_DEFBUTTON2, MB_DEFBUTTON3, MB_SETFOREGROUND Return: IDOK, IDCANCEL, IDABORT, IDRETRY, IDIGNORE, IDYES, IDNO, IDTRYAGAIN, IDCONTINUE *) function MsgBoxEx( const Text: String; const Caption: String; const IconSource: Variant; const IconID: Variant; const Flags: DWORD ): Integer; var hInstance: HINST; UsedIconID: Variant; begin hInstance := 0; UsedIconID := IconID; if VarType(IconSource) <> varInteger then begin if IconSource = '' then hInstance := _WinAPI_GetModuleHandle('') else hInstance := _WinAPI_LoadLibraryEx(IconSource, 0, LOAD_LIBRARY_AS_IMAGE_RESOURCE); if hInstance = 0 then UsedIconID := IDI_APPLICATION // fallback to 'defaulticon' end; if VarType(UsedIconID) = varInteger then Result := MsgBoxExNI(Text, Caption, hInstance, UsedIconID, Flags) else Result := MsgBoxExSI(Text, Caption, hInstance, UsedIconID, Flags); if (hInstance > 0) and (IconSource <> '') then _WinAPI_FreeLibrary(hInstance); end; #endif подключаемый WinAPILoader.pas
#ifndef WinAPILoader__pas #define WinAPILoader__pas #include 'WinAPI.pas' const LOAD_LIBRARY_AS_IMAGE_RESOURCE = $20; LOAD_LIBRARY_AS_DATAFILE = $2; // https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibraryexw function _WinAPI_LoadLibraryEx(const lpLibFileName: String; const Zero: Integer; const dwFlags: DWORD): HINST; external 'LoadLibraryExW@Kernel32.dll stdcall'; // https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-freelibrary function _WinAPI_FreeLibrary(const hLibModule: HINST): Boolean; external 'FreeLibrary@Kernel32.dll stdcall'; // https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlew function _WinAPI_GetModuleHandle(const ModuleName: String): HINST; external 'GetModuleHandleW@Kernel32.dll stdcall'; #endif подключаемый WinAPI.pas
Пришлось использовать две разные структуры и функции, т.к. мне непонятно как можно числовое значение преобразовать в LPCWSTR. |
Последний раз редактировалось iglezz, 10-06-2022 в 16:09. Отправлено: 14:40, 01-06-2022 | #769 |
Ветеран Сообщения: 2186
|
Профиль | Отправить PM | Цитировать iglezz,
Пример собрал, прикрутил все подключаемые модули. Все отрабатывает как надо. Попробовал прикрутить к своему скрипту - отрабатывает окно MsgBoxEx, т.е. выскакивает второе окошко, но, ни заголовок окна, ни значок в окне не отображаются. При этом все флаги отрабатывают. Т.е., функционал весь и работоспособность сохраняются. Возможно, возникает конфликт с моим, имеющемся кодом... Буду разбираться... iglezz, Вам, от всей души, огромное спасибо за предоставленный материал и примеры! |
Отправлено: 00:26, 08-06-2022 | #770 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Скрипты 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 |
|