Запретить запуск второго экземпляра программы 2

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

— Чем отличается программист от политика?

— Программисту платят деньги за работающие программы.

var

AtomText: array [0..31] of Char;

procedure LookForPreviousInstance;

var

PreviousInstanceWindow : hWnd;

AppName : array[0..30] of char;

FoundAtom : TAtom;

begin

// помещаем имя приложения в AtomText

StrFmt(AtomText, ‘OnlyOne%s’, [Copy(Application.Title,1,20)]);

// Проверяем, не создано ли уже атома с таким именем приложения

FoundAtom := GlobalFindAtom(AtomText);

if FoundAtom 0 then { эта копия приложения уже запущена }

begin

StrFmt(AppName,’%s’, [Application.Title]);

// изменяем текущий заголовок, чтобы FindWindow не видела его

Application.ShowMainForm := false;

Application.Title := ‘destroy me’;

// ищем предыдущую копию приложения

PreviousInstanceWindow := FindWindow(nil,AppName);

// Передаём фокус на предыдущую копию приложения

// завершаем текущую копию

Application.Terminate;

if PreviousInstanceWindow 0 then

if IsIconic(PreviousInstanceWindow) then

ShowWindow(PreviousInstanceWindow,SW_RESTORE)

else

SetForegroundWindow(PreviousInstanceWindow);

end;

// создаём глобальный атом, чтобы предотвратить

// запуск другой копии приложения

FoundAtom := GlobalAddAtom(AtomText);

end;

constructor TForm.Create(AOwner: TComponent);

begin

inherited;

LookForPreviousInstance;

end;

destructor TForm.Destroy;

var

FoundAtom : TAtom;

ValueReturned : word;

begin

// не забудьте удалить глобальный атом

FoundAtom := GlobalFindAtom(AtomText);

if FoundAtom 0 then

ValueReturned := GlobalDeleteAtom(FoundAtom);

inherited Destroy;

end;

{/codecitation}

Добавить комментарий