Найти в Дзене

Запуск первой копии программы вместо второй в Delphi

Искал на просторах Интернета решение задачи запуска первой копии программы вместо второй. Трудно пришлось. Но всё-таки после тщательного анализа и опробования многих предложений вот что получилось: {------------} program arm_usi_tcp; uses Forms, Windows, ..... , Messages, main in 'main.pas' {Form1}, ........ {$R *.RES} var hMutex: THandle; hwndPrev: HWND; begin HMutex := CreateMutex (nil, True, 'svc_arm_usi_tcp'); if WaitForSingleObject (hMutex, 0) <> wait_TimeOut then begin {------первый запуск программы} Application.Initialize; Application.HelpFile := ''; Application.CreateForm(TForm1, Form1); ....... ....... ....... ....... Application.Run; end else begin {------Запуск первой копии вместо запуска второй} ReleaseMutex(HMutex); Application.MessageBox( PChar( 'Эта программа уже запущена!'+#13+#10+ 'Обратите внимание на панель задач.'), '', MB_OK + MB_ICONASTERISK); hwndPrev:= FindWindow('TForm1',

Искал на просторах Интернета решение задачи запуска первой копии программы вместо второй. Трудно пришлось. Но всё-таки после тщательного анализа и опробования многих предложений вот что получилось:

{------------}

program arm_usi_tcp;

uses

Forms,

Windows, ..... , Messages,

main in 'main.pas' {Form1},

........

{$R *.RES}

var

hMutex: THandle;

hwndPrev: HWND;

begin

HMutex := CreateMutex (nil, True, 'svc_arm_usi_tcp');

if WaitForSingleObject (hMutex, 0) <> wait_TimeOut then

begin {------первый запуск программы}

Application.Initialize;

Application.HelpFile := '';

Application.CreateForm(TForm1, Form1);

.......

.......

.......

.......

Application.Run;

end

else

begin {------Запуск первой копии вместо запуска второй}

ReleaseMutex(HMutex);

Application.MessageBox(

PChar(

'Эта программа уже запущена!'+#13+#10+

'Обратите внимание на панель задач.'),

'',

MB_OK + MB_ICONASTERISK);

hwndPrev:= FindWindow('TForm1',Form_title);

if hwndPrev <> 0 then

begin

SendMessage(hwndPrev,WM_GOTOFOREGROUND,0,0);

end;

Application.Terminate;

end;

end.

{------------}

unit main;

interface

uses

Windows, Messages, ........;

const

WM_GOTOFOREGROUND = WM_USER+1;

Form_title = 'АРМ оператора УСИ (протокол MODBUS TCP)';

.............

.............

.............

.............

type

TForm1 = class(TForm)

.......

.......

.......

.......

private

{ Private declarations }

.......

public

{ Public declarations }

.......

procedure WMGotoForeground(var Msg:TMessage);message WM_GOTOFOREGROUND;

protected

.......

end;

.............

.............

.............

.............

implementation

uses

.............

.............

.............

.............

{$R *.DFM}

{-----}

procedure TForm1.WMGotoForeground(var Msg: TMessage);

var s:PAnsiChar;

begin

ShowWindow(Application.Handle, SW_RESTORE);

Form1.Visible:=true; //думаю, что не обязательный оператор

end;

.......

.......

.......

end;

Всё прекрасно работает! Надеюсь, что кому-нибудь пригодится.