У меня есть элементарный вариант, проще не бывает. Предлагаемый мной модуль только определяет запущена программа или нет. Я не стал усложнять этот модуль автоматическим изменением имени семафора на случай если две программы захотят использовать этот модуль одновременно. Имея самые скромные навыки в программировании можно придумать семафору своё уникальное имя и переписать его в previnst.pas вовсе не обязательно семафор называть AbraShvabra. Использование: В модуле program в части Uses нужно добавить previnst и вы получаете переменную ммм: boolean которая true если копия программы уже запущена. Пример: program Project1;
uses previnst, windows, Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} begin if mmm then begin ShowWindow(FindWindow('tform1','Имя окна которое активизировать'), SW_restore); SetForegroundWindow(FindWindow('tform1','Имя окна которое активизировать')); halt; //завершить программу не создавая ничего. end;
//Тело программы прогры Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. содержание модуля previnst.pas unit Previnst;
interface
uses Windows;
var mmm:boolean; //эта переменная если true то программа уже запущена
implementation
var hMutex : integer; begin mmm:=false; hMutex:=CreateMutex(nil,TRUE,'AbraShvabra'); // Создаем семафор if GetLastError <> 0 then mmm:=true; // Ошибка семафор уже создан ReleaseMutex(hMutex); end. |