Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Закрытая тема
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 5]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1270
Благодарности: 1028


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2
Скрипты Inno Setup. Помощь и советы [часть 3]
Скрипты Inno Setup. Помощь и советы [часть 4]

Отправлено: 03:49, 21-05-2012

 

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Johny777, спасибо! "Тихую" установку реализовали в NSIS пока-что, но за код благодарю отдельно.

Отправлено: 09:16, 06-02-2013 | #1621



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день. Мне нужно установить приложение, которое меняет настройки IE. Сейчас параметры прописываются в реестре для HKCU, но мне нужно, чтобы они применялись и для остальных пользователей. Пробовал добавлять в HKLM и HKU/.DEFAULT, но параметры не подхватываются. Кто-нибудь сталкивался?

Отправлено: 10:24, 07-02-2013 | #1622


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Пацаны помогите пожалуйста вместо скрытия подсказок ( http://forum.oszone.net/post-2080773-1638.html ) добавить кнопку "свернуть" в
заголовок формы ( BorderStyle := bsDialog )
а именно через функцию DrawFrameControl(..., DFCS_CAPTIONMIN, ...)
вот мой потр (не рабочий):
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  GWL_WNDPROC = -4;
  SM_CXSIZE = 30;
  SM_CYSIZE = 31;
  SM_CXFRAME = $20;
  SM_CYFRAME = 33;

  DFC_BUTTON = 4;
  DFCS_BUTTONPUSH = $10;
  DFCS_PUSHED = $200;

  WM_NCACTIVATE = $0086;
  DFCS_CAPTIONMIN = 1;


  
type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  HDC = LongWord;
  PRect = TRect;

var
  OldWindowProc: Longint;
  R: TRect;
  Press: Boolean;


function GetWindowDC(hWnd: HWND): HDC; external 'GetWindowDC@user32.dll stdcall';
function GetSystemMetrics(nIndex: Integer): Integer; external 'GetSystemMetrics@user32.dll stdcall';
function DrawFrameControl(DC: HDC; Rect: PRect; uType, uState: UINT): BOOL; external 'DrawFrameControl@user32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';


function Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect;
begin
  Result.Left := ALeft;
  Result.Top := ATop;
  Result.Right := AWidth;
  Result.Bottom := AHeight;
end;

procedure DrawBtn(Ctrl: TWinControl); 
var
  WDc: HDC;
  Cx, Cy: Integer;
  XFrame, Yframe: Integer;
  iHandle: HWND;
begin
  iHandle := Ctrl.Handle;
  WDc := GetWindowDc(iHandle);
  Cx := GetSystemMetrics(SM_CXSIZE);
  Cy := GetSystemMetrics(SM_CYSIZE);
  xFrame := GetSystemMetrics(SM_CXFRAME);
  yFrame := GetSystemMetrics(SM_CYFRAME);
  R := Bounds(Ctrl.Width - xFrame - 4*Cx + 2, yFrame + 2, Cx - 2, Cy - 4);
  if Press then
    DrawFrameControl(WDc, R ,DFC_BUTTON, DFCS_CAPTIONMIN or DFCS_PUSHED)
  else
    DrawFrameControl(WDc,R, DFC_BUTTON, DFCS_CAPTIONMIN);
  ReleaseDc(iHandle,WDC);
end;


function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
  if Msg = WM_NCACTIVATE then DrawBtn(WizardForm);
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
  WizardForm.BorderStyle := bsDialog;
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
// 
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC or -21, OldWindowProc);
end;


очень хочу 2 нормальные кнопки в заголовке!
Буду очень признателен!

вот исходник на дельфи

Последний раз редактировалось Johny777, 26-03-2013 в 15:57.


Отправлено: 15:11, 07-02-2013 | #1623


Пользователь


Сообщения: 148
Благодарности: 49

Профиль | Отправить PM | Цитировать


Цитата Johny777:
вместо скрытия подсказок »
лучше скрыть иначе тогда еще геморойнее.
Вообщем досех пор думаю над твоим вопросом, вот функция скрытия системных хинтов на делфи
читать дальше »
Код: Выделить весь код
unit Unit1;

interface

uses
  Windows,Messages,SysUtils,Forms;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    SysTooltip: HWND;
    procedure WMNCMouseMove(var Msg: TMessage); message WM_NCMOUSEMOVE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL; stdcall;
var
  WndCl: PChar;
begin
  Result := True;
  if not IsWindowVisible(Wnd) then Exit;
  GetMem(WndCl, 256 * SizeOf(Char));
  try
    GetClassName(Wnd, WndCl, 255);
    Result := (StrPas(WndCl) <> '#32774');
    if not Result then
      ShowWindow(Wnd, SW_HIDE);
  finally
    FreeMem(WndCl, 256 * SizeOf(Char));
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SysTooltip := 0;
  EnumWindows(@HideSystemTooltip, 0);
end;

procedure TForm1.WMNCMouseMove(var Msg: TMessage);
begin
  if not IsWindow(SysTooltip) then
    EnumWindows(@HideSystemTooltip, 0);
  if not IsWindowVisible(SysTooltip) then Exit;
end;

end.

Опыта в делфи у меня мало (в написании библиотек), можно сказать что ноль, полный ноль. Начил изучать пока с основ. Но вопрос хотелось бы уже решить. Может кто-нибудь по-умнее может написать библеотеку для инно. Johny777, , без библы тут необойтись все-равно. (по крайней мере я так думаю)
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:21, 07-02-2013 | #1624


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1270
Благодарности: 1028

Профиль | Отправить PM | Цитировать


Цитата Johny777:
добавить кнопку "свернуть" в
заголовок формы ( BorderStyle := bsDialog ) »
Johny777, так пойдет?
Код: Выделить весь код
const
    GWL_STYLE = (-16);
    WS_MINIMIZEBOX = $20000;
    
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';

procedure InitializeWizard();
begin
    WizardForm.BorderStyle := bsDialog;
    SetWindowLong(WizardForm.Handle, GWL_STYLE, GetWindowLong(WizardForm.Handle, GWL_STYLE) or WS_MINIMIZEBOX);
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:39, 07-02-2013 | #1625


Аватара для Mailchik

Пользователь


Сообщения: 78
Благодарности: 63

Профиль | Отправить PM | Цитировать


Цитата El Sanchez:
Johny777, так пойдет? »
Вряд ли. Johny777 хочет только кнопку минимизации и закрытия. То есть полностью удалить кнопку максимизации.
P.S. Интересная идея, но я не видел еще таких приложений, только с кнопкой минимизации и закрытия. Если имеются таковые, можно ссылочку.
P.S.S. Чтобы именно Windows'овские системные кнопки были.

Последний раз редактировалось Mailchik, 07-02-2013 в 21:19.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:54, 07-02-2013 | #1626


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Цитата El Sanchez:
так пойдет? »
El Sanchez, Не, не то
нужно скрыть неактивную сис. кнопку "развернуть" на форме и оставит только "свернуть" и "закрыть", причём чтоб они лежали рядом друг с другом без пробела
тк юзаю скин придумал извартский, но на удивление рабочий способ ( описание-( http://forum.oszone.net/post-2080773-1638.html ), реализация-( http://forum.oszone.net/post-2081356-1640.html ) ), но обломился (описание почему по первой ссылке).
Откровено говоря не знаю что пихать в библиотеку, чтоб скрыть тултипы, тк кода на 10 строк, но кажись мой порт не работает из-за замены функций GetMem(...), FreeMem(...)
И вот недавно нарвался на функцию DrawFrameControl которая может многое, включая добавление своих кнопок в заголовок формы и (внимание) стандартных - системных.
Тут же нашёлся пример по добавлении своей кнопки (исходник прикреплен в пред. сообщении), но с флагом-константой DFCS_CAPTIONMIN = 1; можно добавить по координатам
прямоугольника (TRect) стандртную кнопку "свернуть" аккурат слева от единственной кнопки "закрыть" (она одна при BorderStyle := bsDialog), но как известно из 10 раз я облaмываюсь на таких попытках 9,5 раз и это как раз тот случай.


sergey3695,
то же самое лежит здесь http://forum.vingrad.ru/forum/topic-...-system/0.html
видел уже! проблема в другом. Даже если скрыть или заменить тултип, то остаётся ст. сис. меню, вызываемое кликом правой кнопкой мыши по заголовку и левым кликом по иконке (по той, что в левом верхнем углу). А там айтем развернуть который сворчивает окно (те ещё хуже тултипа). Да его можно удалить, но тогда окну не будут посылаться сообщения "развернуть", которые мы меняем на "свернуть". Кажись фиг бы с ним, ведь у нас есть WM_NCLBUTTONDOWN с wParam = HTMAXBUTTON - нажатие на кнопку развернуть, но нажатие <> клик! Можно отловить правый клик по заголовку и обнулить сообщение WM_NCRBUTTONDOWN, но остаётся левый клик по иконке и появится снова сис. контекстное меню. Тут думаю нужно определять положение мыши (TPoint) и сравнивать с TRect-ом формы (х, у) и выполнять что-то вроде ( http://forum.oszone.net/post-2081583-1646.html )

В общем пока-что самый привлекательный способ - добавить свою кнопку

Отправлено: 03:28, 08-02-2013 | #1627


Аватара для Mailchik

Пользователь


Сообщения: 78
Благодарности: 63

Профиль | Отправить PM | Цитировать


Johny777, я думаю, ты понимаешь, что используя DrawFrameControl, форма будет иметь до XP'шный стиль.
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Code]
#ifdef UNICODE
 #define A "W"
 type
  PChar = PAnsiChar;
#else
 #define A "A"
#endif

const
  GWL_WNDPROC = -4;
  DFC_CAPTION = 1;
  DFCS_CAPTIONMIN = 1;
  DFCS_PUSHED = $200;
  WM_SETFOCUS         = $0007;
  WM_NCLBUTTONDOWN    = $00A1;
  WM_NCLBUTTONUP      = $00A2;
  WM_NCACTIVATE       = $0086;
  WM_NCCALCSIZE       = $0083;
  WM_NCPAINT          = $0085;
  WM_ACTIVATE         = $0006;
  WM_WINDOWPOSCHANGING = $0046;
  WA_INACTIVE = 0;

type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  HDC = LongWord;
  SHORT = Longint;

var
  OldWindowProc: Longint;
  myPoint: TPoint;
  myRect: TRect;
  myDC: HDC;

function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint;
  external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
  external 'CallWindowProc{#A}@user32.dll stdcall';
function GetCursorPos(var lpPoint: TPoint): BOOL;
  external 'GetCursorPos@user32.dll stdcall';
function GetWindowDC(hWnd: HWND): HDC;
  external 'GetWindowDC@user32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: HDC): Integer;
  external 'ReleaseDC@user32.dll stdcall';
function DrawFrameControl(DC: HDC; const Rect: TRect; uType, uState: UINT): BOOL;
  external 'DrawFrameControl@user32.dll stdcall';

procedure DrawButton(State: Cardinal);
 begin
 myRect.Left := WizardForm.Width - ScaleX(46);
 myRect.Right := WizardForm.Width - ScaleX(27);
 myRect.Top := ScaleY(5);
 myRect.Bottom := ScaleY(22);
 myDC := GetWindowDC(WizardForm.Handle);
 try
  DrawFrameControl(myDC, myRect, DFC_CAPTION , DFCS_CAPTIONMIN or State);
 finally
  ReleaseDC(WizardForm.Handle, myDC);
 end;
end;

function PointIntoRect: boolean;
var
 myPoint: TPoint;
 begin
  GetCursorPos(myPoint);
  Result :=
    (myPoint.X - WizardForm.Left >= WizardForm.Width - ScaleX(46)) and
    (myPoint.X - WizardForm.Left <= WizardForm.Width - ScaleX(27)) and
    (myPoint.Y - WizardForm.Top >= ScaleY(5)) and
    (myPoint.Y - WizardForm.Top <= ScaleY(22));
end;

function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
 begin
  case Msg of
    WM_NCACTIVATE, WM_NCCALCSIZE, WM_ACTIVATE, WM_NCPAINT, WM_WINDOWPOSCHANGING, WM_SETFOCUS: DrawButton(0);
    //WM_NCLBUTTONDOWN: if PointIntoRect then DrawButton(DFCS_Pushed); //состояние нажатия кнопки;
    WM_NCLBUTTONDOWN: if PointIntoRect then Application.Minimize;
  end;
  if wParam = WA_INACTIVE then DrawButton(0);
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
 begin
 with WizardForm do begin
  BorderIcons := [biSystemMenu];
 end;
 OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
end;

procedure DeinitializeSetup();
 begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldWindowProc);
end;

Последний раз редактировалось Mailchik, 08-02-2013 в 18:41.

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:13, 08-02-2013 | #1628


Пользователь


Сообщения: 148
Благодарности: 49

Профиль | Отправить PM | Цитировать


Johny777, вот решение твой проблемы
Спасибо большое Mailchik, за помощь. Я так и думал что где-то чето накасячил но не мог понять что. Вообщем то Johny777, он тоже тем самым что помог мне, помог и тебе. Хотя этот вопрос меня тоже заинтересовал так что мне тоже захотелось две кнопочки )
к сожалению библеотеку меньше весом не сделать. (ну я на килобайт поменьше сделал (127 кб) но это пустяк)

Последний раз редактировалось sergey3695, 09-02-2013 в 14:51.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:26, 09-02-2013 | #1629


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


sergey3695, спасибо, но только-что смог таки скрыть тултипы (ведь знал же что библиотека в этом случае - перебор)
пихать в библиотеку это явно нет смысла:
Код: Выделить весь код
function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL;
begin
  Result := ShowWindow(FindWindowByClassName('#32774'), SW_HIDE);
end;
полный пример:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp


[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external
Source: steam.cjstyles; Flags: dontcopy
Source: isskin.dll; Flags: dontcopy


[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  GWL_WNDPROC = -4;
  WM_NCMOUSEMOVE = $00A0;
  
type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  SHORT = Longint;

var
  OldWindowProc: Longint;
  
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL;
begin
  Result := ShowWindow(FindWindowByClassName('#32774'), SW_HIDE);
end;

function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
  if Msg = WM_NCMOUSEMOVE then EnumWindows(CallbackAddr('HideSystemTooltip'), 0);
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;


procedure InitializeWizard();
begin
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldWindowProc);
end;

касательно сокрытия кнопки развернуть:
Mailchik, Спасибо большое за код. Знаю что стиль "Аэро" слетает, но не важно тк хотел использовать только со скином, но кнопка не текстурируется , поэтому
Mailchik, sergey3695, предлагаю доработанный метод подмены сообщений:
сис меню больше не вызывается при клике по иконке и за неё теперь можно таскать, + в том что сворачивание происходит при клике а не нажатии на кнопку:
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  GWL_WNDPROC = -4;
  WM_SYSCOMMAND = $0112;
  SC_MINIMIZE = 61472;
  SC_MAXIMIZE = 61488;
  SC_SIZE = 61440;
  SC_MOVE = 61456;
  WM_NCLBUTTONDBLCLK = $00A3;
  MF_BYCOMMAND = 0;
  WM_NCLBUTTONDOWN = $00A1;
  WM_NCRBUTTONDOWN = $00A4;
  WM_NCMOUSEMOVE = $00A0;
  SC_CLOSE = 61536;
  VK_LBUTTON = 1;
  SC_DRAGMOVE = $F012;
  WM_JOHNY = 7777;

type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  SHORT = Longint;

var
  OldWindowProc: Longint;
  SysPopupMenu: TPopupMenu;

function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function GetWindowRect(hWnd: HWND; var lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall';
function GetKeyState(nVirtKey: Integer): SHORT; external 'GetKeyState@user32.dll stdcall';
function ReleaseCapture: BOOL; external 'ReleaseCapture@user32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL;
begin
  Result := ShowWindow(FindWindowByClassName('#32774'), SW_HIDE);
end;


function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
  pt: TPoint;
  rt: TRect;
begin
  case Msg of
    WM_SYSCOMMAND:
    case wParam of
      SC_MAXIMIZE:
      begin
        wParam := 0;
        SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
      end;
    end;
    WM_NCMOUSEMOVE: EnumWindows(CallbackAddr('HideSystemTooltip'), 0);
    WM_NCLBUTTONDBLCLK: Msg := 0; // двойной клик по заголовку окна
    WM_NCRBUTTONDOWN:
    begin
      Msg := 0;
      if GetCursorPos(pt) then SysPopupMenu.Popup(pt.x, pt.y);
    end;
    WM_NCLBUTTONDOWN: if GetCursorPos(pt) and GetWindowRect(hWnd, rt) then
    if (pt.x > rt.Left) and (pt.x < rt.Right-WizardForm.Width+27) and (pt.y > rt.Top) and (pt.y < rt.Bottom-WizardForm.Height+27) then
    begin
      ReleaseCapture;
      SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);

    end;
//    WM_JOHNY: MsgBox('демо подмены кнопок от Johny777 :)', mbInformation, MB_OK);
  end;
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;

procedure SysMenuOnClick(Sender: TObject);
begin
  case TMenuItem(Sender).Caption of
    'MINIMIZE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
    'CLOSE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
    'MOVE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MOVE, 0);
  end;
end;

procedure InitializeWizard();
var
  hSYSMENU: HWND;
  mMinimize, mClose, mMove: TMenuItem;
begin
  WizardForm.BorderIcons := [biSystemMenu, biMaximize];
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
  SysPopupMenu := TPopupMenu.Create(WizardForm);
  with SysPopupMenu do
  begin
    mMinimize := TMenuItem.Create(WizardForm);
    with mMinimize do
    begin
      Caption := 'MINIMIZE';
      SysPopupMenu.Items.Add(mMinimize);
      OnClick := @SysMenuOnClick;
    end;
    mClose := TMenuItem.Create(WizardForm);
    with mClose do
    begin
      Caption := 'CLOSE';
      SysPopupMenu.Items.Add(mClose);
      OnClick := @SysMenuOnClick;
    end;
    mMove := TMenuItem.Create(WizardForm);
    with mMove do
    begin
      Caption := 'MOVE';
      SysPopupMenu.Items.Add(mMove);
      OnClick := @SysMenuOnClick;
    end;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpWelcome then SendMessage(WizardForm.Handle, WM_JOHNY, 0, 0);
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldWindowProc);
end;

в сообщении sergey3695 есть перерисованный скин. Пробуйте. Есть рекомендации по улучшению - говорите! По возможности исправлю/добавлю

Мне осталось только доработать подменённое сис меню и добавить свои хинты (можно и через ISHint.dll)

============================================= UPDATE =========================================================

изучаю потихоньку вин апи, вот вам подарок:

читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[  code]
const
  FLASHW_STOP = $0;
  FLASHW_CAPTION = $1;
  FLASHW_TRAY = $2;
  FLASHW_ALL = FLASHW_CAPTION or FLASHW_TRAY;
  FLASHW_TIMER = $4;
  FLASHW_TIMERNOFG = $C;
  

type
  FLASHWINFO = record
    cbSize: UINT;
    hwnd: HWND;
    dwFlags: DWORD;
    uCount: UINT; // Число миганий
    dwTimeout: DWORD; // промежуток между миганиями
  end;


function FlashWindowEx(var pfwi: FLASHWINFO): BOOL; external 'FlashWindowEx@user32.dll stdcall';


procedure CurPageChanged(CurPageID: Integer);
var
  fl: FLASHWINFO;
begin
  fl.cbSize := SizeOf(fl);
  fl.dwTimeout := 777;
  fl.hwnd :=  Application.Handle;
  fl.uCount := 3;
  fl.dwFlags := FLASHW_TRAY;
  FlashWindowEx(fl);
end;


Последний раз редактировалось Johny777, 09-02-2013 в 15:34.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:12, 09-02-2013 | #1630



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход