Как запустить один экземпляр delphi приложения

Работая с некоторыми приложениями нужно быть уверенным, что нельзя запустить второй экземпляр этого же приложения. Внося какие  либо данные, после этого сделав перерыв, забыв что приложение уже запущено, запустить его вновь и продолжать делать уже сделанную работу.

Рассмотрим вариант когда вторая копия приложения будет закрыта, нам о этом будет сообщено, а первый экземпляр приложения будет активирован.

Запуская программу, с помощью функции API - FindWindow, будем просматривать список открытых в системе окон и проверять не открыто ли главное окно нашей программы. Если искомое окно не найдено, то функция FindWindow вернет нулевое значение, в противном случае будет возвращен дескриптор окна.

Обращение к данной функции должно быть совершено в процессе инициализации приложения. Иначе если вызывать поиск из главной формы, то к этому моменту форма будет уже создана и открыта. И найдя саму себя приложение заблокирует свою работу и не будет запускаться никогда.

Создадим новое приложение и присвоим форме имя - fmMain. Класс формы будет автоматически присвоен -TfmMain. Свойству Caption формы присвоим значение - "Моя программа".

Придумывая данные значения необходимо подбирать оригинальные значения, которые не могли бы повторяться (иначе может получиться так, что приложение не запуститься).

С помощью API - функции SetForegroundWindow(hwndWindow: HWND): Boolean окно с числом дескриптора равным hwndWindow будет размещено поверх других окон.

Что бы форма приложения не была пустой, я разместил на форме компонент Edit с кнопкой, которая при нажатии устанавливает значение 55.

Полный текст кода приложения расположен ниже.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfmMain = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmMain: TfmMain;
  H: HWND;

implementation

{$R *.dfm}

procedure TfmMain.Button1Click(Sender: TObject);
begin
    Edit1.Text:='55';
end;

initialization

begin

 H:=FindWindow('TfmMain','Моя программа');
 if h<>0 then

  begin
  Try
   ShowMessage('       Программа уже загружена!');
   SetForegroundWindow(h);
   application.Terminate;
  except
  end;
end;
end;

end.

При открытом главном окне программы в системе, если мы попытаемся запустить второй экземпляр приложения функция FindWindow возвратит ненулевое значение. Что заставит, с помощью функции SetForegroundWindow, активизировать окно нашего приложения и разместить его поверх всех остальных окон, а процесс выполнения второго экземпляра будет прерван.

Итог: Мы узнали как создать простое одно экземплярное приложение.

Понравилась статья? Раскажите друзьям:
Общайтесь со мной

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>