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
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
Curtir tópico
+ 0
Responder
Post mais votado
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
Natanael Ferreira
Responder
Mais Posts
31/03/2022
Kauan Oliveira
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?
Responder
31/03/2022
Natanael Ferreira
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.
Responder
Clique aqui para fazer login e interagir na Comunidade :)