Определяем работает ли уже данное приложение в Delphi

Узнать, запущено ли уже приложение, можно несколькими способами.

Способ 1

program Project1;
 
uses
  Windows,Forms,
  Unit1 in 'Unit1.pas' {Form1};
 
{$R *.res}
Const
 MemFileSize = 1024;
 MemFileName = 'one_inst_demo_memfile';
Var
 MemHnd : HWND;
begin
  MemHnd := CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, MemFileSize, MemFileName);
  if GetLastError<>ERROR_ALREADY_EXISTS then
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end.

Способ 2

Узнаем по списку запущенных приложений.

procedure TForm1.FormCreate(Sender: TObject);
var
  Wnd : hWnd;
  buff : ARRAY[0.. 127] OF Char;
Begin
  Wnd := GetWindow(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
        MessageDlg('Приложение уже загружено', mtWarning, [mbOk], 0);
        Halt;
      end;
    end;
    Wnd := GetWindow (Wnd, gw_hWndNext);
  end;
end;

Способ 3

Можно в памяти создавать временные файлы. При перезагрузке они теряются, а так существуют. Кстати, этот метод можно использовать и для обмена информацией между вашими приложениями. Пример:

program Project1;
uses
  Windows, // Обязательно
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
 
{$R *.RES}
Const
  MemFileSize = 1024;
  MemFileName = 'one_inst_demo_memfile';
Var
  MemHnd : HWND;
begin
  { Попытаемся создать файл в памяти }
  MemHnd:=CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE,0, MemFileSize, MemFileName);
  { Если файл не существовал запускаем приложение }
  if GetLastError<>ERROR_ALREADY_EXISTS then
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
  CloseHandle(MemHnd);
end.

Способ 4

Часто при работе у пользователя может быть открыто 5-20 окон и сообщение о том, что программа уже запущено приводит к тому, что он вынужден полчаса искать ранее запущенную копию. Выход из положения — найдя копию программы активировать ее, для чего в последнем примере перед HALT необходимо добавить строку:

SetForegroundWindow(Wnd);

Например так:

program Project0;
uses
  Windows,  // !!!
  Forms,
  Unit0 in 'Unit0.pas' {Form1};
var
  Handle1 : LongInt;
  Handle2 : LongInt;
{$R *.RES}
begin
  Application.Initialize;
  Handle1 := FindWindow('TForm1',nil);
  if handle1 = 0 then
  begin
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end
  else
  begin
    Handle2 := GetWindow(Handle1,GW_OWNER);
    //Чтоб заметили
    ShowWindow(Handle2,SW_HIDE); ShowWindow(Handle2,SW_RESTORE); 
    SetForegroundWindow(Handle1); // Активизируем
  end;
end.
Kwork.ru - услуги фрилансеров от 500 руб.
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Добавить комментарий