Erro ao verificar se aplicação está aberta

24/03/2022

0

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

Responder

Post mais votado

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

Natanael Ferreira

Natanael Ferreira
Responder

Mais Posts

30/03/2022

Assis Ferreira

E qual é o erro?
Tem outros exemplos na internet.
Responder

31/03/2022

Kauan Oliveira

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?
Responder

31/03/2022

Natanael Ferreira

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.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar