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

Показать сообщение отдельно

Ветеран


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

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


Raf-9600,
Попробуйте
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: SoundUnit; Description: Описание SoundUnit; Types: full custom
Name: inMPQ; Description: Описание inMPQ; Types: full

[Run]
Filename: {app}\del Ogg [SoundUnit].bat; StatusMsg: Удаление лишних файлов...; Components: SoundUnit; Afterinstall: Ext; Flags: runhidden

[code]
////////////////////////////////////////////
//  Данный скрипт прячет чужую программу    
////////////////////////////////////////////

type
  _TMsg = record
    hwnd: HWND;
    message: LongWord;
    wParam: Longint;
    lParam: Longint;
    time: LongWord;
    pt: TPoint;
  end;

const
  WM_CLOSE            = $0010;
  WM_QUIT             = $0012;
  PM_REMOVE           = 1;

// отобpажает или пpячет окно обpазом, указанным паpаметpом CmdShow
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';
// запускает указанный файл, с параметрами указанными в CmdShow
function WinExec(lpCmdLine: PChar; uCmdShow: Cardinal): Cardinal;
  external 'WinExec@kernel32.dll stdcall';

// пpовеpяет очеpедь пpикладной задачи на сообщение и копиpует его в Msg,
// если в очеpеди нет сообщений, функция выполняет немедленный возвpат и пеpедает упpавление Windows.
function PeekMessage(var lpMsg: _TMsg; hWnd: HWND;
  wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
// пеpеводит комбинации  wm_KeyDown/Up в wm_Char или wm_DeadChar и комбинации wm_SysKeyDown/Up в wm_SysChar или
// wm_SysDeadChar и напpавляет символьное сообщение в очеpедь пpикладной задачи.
function TranslateMessage(const lpMsg: _TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
// пеpедает в Msg сообщение оконной функции окна
function DispatchMessage(const lpMsg: _TMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

var
  cap_win: string;
  _res: Boolean;
// сообщаем, что уже можно запускать RunProg
procedure Ext;
begin
  _res:= True;
end;

procedure Application_ProcessMessages;
var
  Msg: _TMsg;
begin
  while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end;

procedure RunProg(file, param, capt, mes: string; wait: Boolean);
var
  Wnd: THandle;
  i, ID: Integer;
begin
  cap_win:= capt;
  if FileExists(file) = True then // проверям наличие файла рядом с инсталлятором
    begin
      // показываем своё сообщение
      if mes <> '' then WizardForm.StatusLabel.Caption:= mes;
      // запускаем файл
      ID:= WinExec(AddQuotes(file + param), SW_HIDE);
      if ID > 32 then
        repeat
          if FindWindowByWindowName(capt) > 0 then
            begin
              Wnd:= FindWindowByWindowName(capt);
              ShowWindow(Wnd, SW_HIDE); // прячем программу... :)
              Break;
            end
          else Sleep(10);
          i:= i+1;
        until (Wnd > 0) or (i = 500) // выходим из цикла, если нашли окно или после пяти секунд
      else
        begin
          MsgBox('Ошибка при запуске файла: ' + ExtractFileName(file), mbInformation, MB_OK);
          Exit;
        end;
      // если надо подождать, то ждём пока программа не закроется...   
      if wait = True then
        while FindWindowByWindowName(capt) > 0 do
          Application_ProcessMessages;
      WizardForm.StatusLabel.Caption:= WizardForm.StatusLabel.Caption;
    end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  n: Integer;
begin
  if (CurStep = ssPostInstall) and (IsComponentSelected('inMPQ')) then
    begin
      n:= 0;
      while _res = False do
        begin
          n:= n + 1;
          Application_ProcessMessages;
          if n = 60000 then Break;
        end;
        RunProg(ExpandConstant('{src}\winmpq\WinMPQ.exe'), // расположение программы
                ' s Sound.txt',                            // параметр запуска
                'WinMPQ',                                  // заголовок окна программы
                'Встраивание озвучки юнитов...',           // сообщение в окне мастера
                True);                                     // True - ждать завершения программы
    end;
end;

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Отправлено: 22:52, 08-07-2009 | #1097