- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
Var
h : THandle;
procedure TMain.FormCreate(Sender: TObject);
begin
begin
h := CreateMutex(nil, True, PChar(ExtractFileName(Application.ExeName)));
if WaitForSingleObject(h, 0)<>0 then
begin
ShowMessage(‘Программа уже запущена!’);
Application.Terminate;
CloseHandle(h);
end;
end;
А в остальном (если дать мутексу более уникальное имя) - вроде как нормальный способ. Ну разве что WaitForSingleObject можно убрать, т.к. у CreateMutex был какой-то способ выяснить, запилил ли он новый мутех или вернул существующий.
P.S. Ну и вместо выхода с сообщением, если есть возможность, лучше найти окно от той самой уже запущенной программы и кинуть ему какую-нибудь команду - например чтобы показалось или просто всплыло наверх...
var Wnd: hWnd;
buff: array[0.. 127] of Char;
begin
//Получили указатель на первое окно
Wnd:=GetWindow(fmMain.Handle, gw_HWndFirst);
// Поиск
while Wnd<>0 do begin
// Это окно предыдущей копии ?
if (Wnd<>Application.Handle) and (GetWindow(Wnd, gw_Owner)=0) then begin
GetWindowText(Wnd, buff, SizeOf(buff));
if StrPas(buff)=Application.Title then begin
SendMessage(Wnd, WM_SHOWWINDOW, 0, 0);
SetWindowPos(Wnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
Windows.ExitProcess(0);
SetWindowPos(Wnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
Application.Terminate;
Exit;
end;
end;
Wnd:=GetWindow(Wnd, gw_hWndNext);
end;
end;
> Application.Terminate;
> Exit;
Лол ;)
Кстати, а почему окно ищется перебором, а не банальным FindWindowEx?