Как не допустить запуск второй копии программы

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

Биллy Гейтсy пpиписывают следyющее высказывание: «Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо».

Алгоритм, применяемый мною:

В блоке begin..end модуля .dpr:

begin

if HPrevInst 0 then

begin

ActivatePreviousInstance;

Halt;

end;

end;

Реализация в модуле:

unit PrevInst;

interface

uses

WinProcs,

WinTypes,

SysUtils;

type

PHWnd = ^HWnd;

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool; export;

procedure ActivatePreviousInstance;

implementation

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool;

var

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

begin

Result := true;

if GetWindowWord(Wnd, GWW_HINSTANCE) = HPrevInst then

begin

GetClassName(Wnd, ClassName, 30);

if STRIComp(ClassName, ‘TApplication’) = 0 then

begin

TargetWindow^ := Wnd;

Result := false;

end;

end;

end;

procedure ActivatePreviousInstance;

var

PrevInstWnd: HWnd;

begin

PrevInstWnd := 0;

EnumWindows(@EnumApps, LongInt(@PrevInstWnd));

if PrevInstWnd 0 then

if IsIconic(PrevInstWnd) then

ShowWindow(PrevInstWnd, SW_Restore)

else

BringWindowToTop(PrevInstWnd);

end;

end.

{/codecitation}

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