четверг, 26 декабря 2013 г.

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

program Project1;
 
uses
  Windows, Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};
 
{$R *.res}
 
procedure BringItToFront(hWindow : HWND);
var
   fgThread : Cardinal;
   myAppThread : Cardinal;
begin
   fgThread := GetWindowThreadProcessId(GetForegroundWindow, nil);
   myAppThread := GetCurrentThreadId;
 
   AttachThreadInput(fgThread, myAppThread, True);
   ShowWindow(hWindow, SW_RESTORE);
   BringWindowToTop(hWindow); // Это будет работать гарантированно
   AttachThreadInput(fgThread, myAppThread, False);
end;
 
const
   MainFormCaption = 'Test';
var
   hMutex : THandle;
   hPrevWin : HWND;
begin
   ReportMemoryLeaksOnShutdown := True;
 
   Application.Initialize;
   Application.Title := 'MyProgram';
 
   hMutex := CreateMutex(nil, True, PChar(Application.Title));
   if (GetlastError = ERROR_ALREADY_EXISTS) or (GetlastError = ERROR_ACCESS_DENIED) then
   begin
      Application.MessageBox('Программа уже работает!', PChar(Application.Title),
         MB_ICONWARNING or MB_OK);
 
      // Ищем не Application.Title, а заголовок формы
      hPrevWin := FindWindow('TForm1', MainFormCaption);
      if hPrevWin <> 0 then BringItToFront(hPrevWin);
      Exit;
    end;
 
   Application.MainFormOnTaskbar := True;
   Application.CreateForm(TForm1, Form1);
   Application.CreateForm(TForm2, Form2);
   Application.Run;
end.

Комментариев нет:

Отправить комментарий