Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 10
>
>ShowWindow(Application.Handle, SW_ShowNormal);
> Application.ShowMainForm:=True;
> DoFirstInstance;
> result := True;
> end
> else begin
> RegWork.RWSetParamStr1;
> BroadcastFocusMessage;
> result := False;
> end;
>end;
>initialization
>begin
> UniqueAppStr := PChar(Application.ExeName);
> MessageID := RegisterWindowMessage(UniqueAppStr);
> ShowWindow(Application.Handle, SW_Hide);
> Application.ShowMainForm:=FALSE;
>end;
>finalization
>begin
> if WProc <> Nil then SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(WProc));
>end;
>end.
Как не допустить запуск второй копии программы IX
YoungHacker рекомендует следующий код:
Был взят из кулибы и доработан, поскольку возникали ситуации когда программа, по HotKey назначенным на ярлык, запускалась дважды и более раз. Связано с тем что поиск мутекса и его создание разнесены во времени и пока в одном приложении мутекс не нашелся но еще не создался второе приложение тоже не находит мутекса и инициирует его создание
Поиск окон и создание их нарываются на те-же проблемы. Из RxLib Функция тоже не обходит этой ситуации.
Мой вариант немного дорабатывает уже значительно переработанное то что предоставили разработчики Delphi 2 Пачека (Pacheco) и Тайхайра (Teixeira). и находится в файле TPrevInstUnit. В файле проекта пишется следующий вызов:
>begin
> //– Найти предыдущую версию программы
> if (initinstance) then begin
> …
> Application.Initialize;
> …
> Application.CreateForm(…);
> …
> Application.Run;
> end;
>end.
>unit TPrevInstUnit;
>interface
>uses Forms, Windows, Dialogs, SysUtils;
>function InitInstance : Boolean;
>implementation
>const
> UniqueAppStr : PChar = #0; // Различное для каждого приложения
> // Но одинаковое для каждой копии программы
>var
> MessageId : Integer;
> OldWProc : TFNWndProc = Nil;
> MutHandle : THandle = 0;
> SecondExecution : Boolean = False;
>function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint): Longint; StdCall;
>begin
> //- Если это - сообщение о регистрации... }
> if (Msg = MessageID) then begin
>//- если основная форма минимизирована
> if IsIconic(Application.Handle) then begin
>//- восстанавливаем
> ееApplication.Restore;
> end
> else begin
>//- вытаскиваем на перед
> ShowWindow(Application.Handle, SW_SHOW);
> SetForegroundWindow(Application.Handle);
> Application.BringToFront;
> end;
> Result := 0;
> end
> else
>{ В противном случае посылаем сообщение предыдущему окну }
> Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
>end;
>function InitInstance : Boolean;
>var
> BSMRecipients: DWORD;
>begin
> Result := False;
> //- пробуем открыть MUTEX созданный предыдущей копией программы
> MutHandle := CreateMutex(Nil, True, UniqueAppStr);
> //- Мутекс уже был создан ?
> SecondExecution := (GetLastError = ERROR_ALREADY_EXISTS);
> if (MutHandle = 0) then begin
>ShowMessage('Ошибка создания Mutex.');
> Exit;
> end;
> if Not (SecondExecution) then begin
>//- назначаем новый обработчик сообщений приложения, а старый сохраняем
> OldWProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)));
> //- если обработчик не найден устанавливаем ошибку
> if (OldWProc = Nil) then begin
>ShowMessage('Ошибка поиска стандартного обработчика сообщений приложения.');
> Exit;
> end;
> //- Установить "нормальный" статус основного окна приложения
> ShowWindow(Application.Handle, SW_ShowNormal);
> //- покажем основную форму приложения
> Application.ShowMainForm := True;
> //- все нормально мама трын тин тин тин тири тын тын
> Result := True;
> end
> else begin
>//- установить статус окна приложения "невидимый"
> ShowWindow(Application.Handle, SW_Hide);
> //- Не покажем основную форму приложения
> Application.ShowMainForm := False;
> //- Посылаем другому приложению сообщение и информируем о необходимости
> // перевести фокус на себя
> BSMRecipients := BSM_APPLICATIONS;
> BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE, @BSMRecipients, MessageID, 0, 0);
> end;
>end;
>initialization
>begin
> //- Создать ункальную строку для опознания приложения
> UniqueAppStr := PChar('YoungHackerNetworkDataBaseProgramm');
> //- Зарегистрировать в системе уникальное сообщение