Erro ao verificar se aplicação está aberta

Delphi

24/03/2022

Utilizo o seguinte código no delphi 10.3.3 para verificar se o sistema já está aberto

Hand := FindWindow('TApplication', 'Ocorrências - Five');

  if Hand = 0 then
  begin
    Application.Initialize;
    Application.Title := 'MeuSistema';
    Application.MainFormOnTaskbar := True;
    Application.CreateForm(TfrmPrincipal, frmPrincipal);
    Application.Run;
  end else begin
    Application.MessageBox('O MeuSistema já está em execução!','Atenção', MB_OK + MB_ICONWARNING );
    ShowWindow(Hand, SW_NORMAL);
    Application.Terminate;
  end;


Está faltando alguma coisa ou alguma configuração??

Dês de já agradeço
Kauan Oliveira

Kauan Oliveira

Curtidas 0

Melhor post

Natanael Ferreira

Natanael Ferreira

31/03/2022

Para não deixar abrir uma nova instância eu uso CreateMutex:

{1o. Coloque o código abaixo no seu projeto, clicando no menu Project/View Source.

 2o. Adicione a Unit Windows no uses de seu projeto.

   

  Esta dica serve para não deixar que seu aplicativo seja executado mais de uma vez, inclusive no Windows XP  }

 
  {$R *.res}
  Var
    MutexHandle: THandle;
    hwind:HWND;
  begin
    MutexHandle := CreateMutex(nil, TRUE, 'MysampleAppMutex');
    if MutexHandle <> 0 then
    begin
      if GetLastError = ERROR_ALREADY_EXISTS then
      begin
        MessageBox(0, 'Este programa já está em execução!','', mb_IconHand);
        CloseHandle(MutexHandle);
        hwind:=0;
        repeat
          hwind:=Windows.FindWindowEx(0,hwind,'TApplication','My sampleapp');
        until (hwind<>Application.Handle);
        if (hwind<>0) then
        begin
          Windows.ShowWindow(hwind,SW_SHOWNORMAL);
          Windows.SetForegroundWindow(hwind);
        end;
        Halt;
      end
    end;
    Application.Initialize;
    Application.CreateForm(Tf_principal, f_principal);
    Application.Run;
end.


Fonte: http://www.planetadelphi.com.br/dica/1127/usando-mutex-pra-nao-deixar-seu-aplicativo-ser-executado-mais-de-uma-v
GOSTEI 1

Mais Respostas

Assis Ferreira

Assis Ferreira

24/03/2022

E qual é o erro?
Tem outros exemplos na internet.
GOSTEI 0
Kauan Oliveira

Kauan Oliveira

24/03/2022

Para não deixar abrir uma nova instância eu uso CreateMutex:

{1o. Coloque o código abaixo no seu projeto, clicando no menu Project/View Source.

 2o. Adicione a Unit Windows no uses de seu projeto.

   

  Esta dica serve para não deixar que seu aplicativo seja executado mais de uma vez, inclusive no Windows XP  }

 
  {$R *.res}
  Var
    MutexHandle: THandle;
    hwind:HWND;
  begin
    MutexHandle := CreateMutex(nil, TRUE, 'MysampleAppMutex');
    if MutexHandle <> 0 then
    begin
      if GetLastError = ERROR_ALREADY_EXISTS then
      begin
        MessageBox(0, 'Este programa já está em execução!','', mb_IconHand);
        CloseHandle(MutexHandle);
        hwind:=0;
        repeat
          hwind:=Windows.FindWindowEx(0,hwind,'TApplication','My sampleapp');
        until (hwind<>Application.Handle);
        if (hwind<>0) then
        begin
          Windows.ShowWindow(hwind,SW_SHOWNORMAL);
          Windows.SetForegroundWindow(hwind);
        end;
        Halt;
      end
    end;
    Application.Initialize;
    Application.CreateForm(Tf_principal, f_principal);
    Application.Run;
end.


Fonte: http://www.planetadelphi.com.br/dica/1127/usando-mutex-pra-nao-deixar-seu-aplicativo-ser-executado-mais-de-uma-v



Funcionou beleza aqui... Obrigado broo!

Só uma dúvida, sou novo nesse mundo da programação, o que exatamente acontece quando o código entra no repeat?
GOSTEI 0
Natanael Ferreira

Natanael Ferreira

24/03/2022

Para não deixar abrir uma nova instância eu uso CreateMutex:

{1o. Coloque o código abaixo no seu projeto, clicando no menu Project/View Source.

 2o. Adicione a Unit Windows no uses de seu projeto.

   

  Esta dica serve para não deixar que seu aplicativo seja executado mais de uma vez, inclusive no Windows XP  }

 
  {$R *.res}
  Var
    MutexHandle: THandle;
    hwind:HWND;
  begin
    MutexHandle := CreateMutex(nil, TRUE, 'MysampleAppMutex');
    if MutexHandle <> 0 then
    begin
      if GetLastError = ERROR_ALREADY_EXISTS then
      begin
        MessageBox(0, 'Este programa já está em execução!','', mb_IconHand);
        CloseHandle(MutexHandle);
        hwind:=0;
        repeat
          hwind:=Windows.FindWindowEx(0,hwind,'TApplication','My sampleapp');
        until (hwind<>Application.Handle);
        if (hwind<>0) then
        begin
          Windows.ShowWindow(hwind,SW_SHOWNORMAL);
          Windows.SetForegroundWindow(hwind);
        end;
        Halt;
      end
    end;
    Application.Initialize;
    Application.CreateForm(Tf_principal, f_principal);
    Application.Run;
end.


Fonte: http://www.planetadelphi.com.br/dica/1127/usando-mutex-pra-nao-deixar-seu-aplicativo-ser-executado-mais-de-uma-v



Funcionou beleza aqui... Obrigado broo!

Só uma dúvida, sou novo nesse mundo da programação, o que exatamente acontece quando o código entra no repeat?


Neste exemplo, está procurando a janela principal do programa que já estava aberto para trazer para frente.

Veja abaixo, esse código simplificado que faz a mesma tarefa maximizando a aplicação se ela já estiver aberta e minimizada.

var
  Aberto: THandle;

begin
  Aberto := FindWindow('Tf_principal', nil); // colocar aqui a classe do form principal

  if Aberto <> 0 then
  begin
    MessageBox(0, 'Este programa já está em execução!','', mb_IconHand);
    ShowWindow(Aberto, SW_SHOW);
    SetForegroundWindow(Aberto);
    Application.Terminate;
  end;

  Application.Initialize;
  Application.CreateForm(Tf_principal, f_principal);
  Application.Run;

end.
GOSTEI 0
POSTAR