Erro ao verificar se aplicação está aberta
Utilizo o seguinte código no delphi 10.3.3 para verificar se o sistema já está aberto
Está faltando alguma coisa ou alguma configuração??
Dês de já agradeço
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
Curtidas 0
Melhor post
Natanael Ferreira
31/03/2022
Para não deixar abrir uma nova instância eu uso CreateMutex:
Fonte: http://www.planetadelphi.com.br/dica/1127/usando-mutex-pra-nao-deixar-seu-aplicativo-ser-executado-mais-de-uma-v
{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
24/03/2022
E qual é o erro?
Tem outros exemplos na internet.
Tem outros exemplos na internet.
GOSTEI 0
Kauan Oliveira
24/03/2022
Para não deixar abrir uma nova instância eu uso CreateMutex:
Fonte: http://www.planetadelphi.com.br/dica/1127/usando-mutex-pra-nao-deixar-seu-aplicativo-ser-executado-mais-de-uma-v
{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
24/03/2022
Para não deixar abrir uma nova instância eu uso CreateMutex:
Fonte: http://www.planetadelphi.com.br/dica/1127/usando-mutex-pra-nao-deixar-seu-aplicativo-ser-executado-mais-de-uma-v
{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