Verificar se exe já está aberto então mostrar ao usuário

CRUD - Delphi

09/09/2020

Boa tarde.

Implementei em meu arquivo DPR a instrução abaixo para verificar se o plicativo já está em execução, contudo eu não gostaria de dar uma mensagem ao usuário, mas sim gostaria que fosse aberto/mostrado o aplicativo que já está aberto, contudo não sei como fazer, alguém tem alguma sugestão para me auxiliar?

Uso também o componente TrayIcon.

CreateMutex(nil, True, 'XyZzWw');
if GetLastError = ERROR_ALREADY_EXISTS then  begin  // se aplicativo já estiver aberto não abre novamente
  Application.MessageBox('O sistema já está aberto.'+#13+'Verifique o canto inferior direito próximo ao relógio.', 'Sistema Informa', MB_OK + MB_ICONINFORMATION);
  Exit;
end;
Pedro Deola

Pedro Deola

Curtidas 0

Melhor post

Celso Lenon

Celso Lenon

10/09/2020

Boa tarde.

Implementei em meu arquivo DPR a instrução abaixo para verificar se o plicativo já está em execução, contudo eu não gostaria de dar uma mensagem ao usuário, mas sim gostaria que fosse aberto/mostrado o aplicativo que já está aberto, contudo não sei como fazer, alguém tem alguma sugestão para me auxiliar?

Uso também o componente TrayIcon.

CreateMutex(nil, True, 'XyZzWw');
if GetLastError = ERROR_ALREADY_EXISTS then  begin  // se aplicativo já estiver aberto não abre novamente
  Application.MessageBox('O sistema já está aberto.'+#13+'Verifique o canto inferior direito próximo ao relógio.', 'Sistema Informa', MB_OK + MB_ICONINFORMATION);
  Exit;
end;


Exemplo:

var
handle: Thandle;
begin
handle := FindWindow('TfrmPrincipal',nil);
if Handle<>0 then
begin
Application.MessageBox('O APP já Esta em Execução!',
'Sistema em Execução', mb_ok+mb_IconInformation);
//Para Avisar o outro App use algo como:
//SendMessage(handle, WM_NEXTDLGCTL, 0, 0);
//https://www.devmedia.com.br/windows-messages/1243
Application.Terminate;
end
Else
begin
Application.Initialize;
Application.CreateForm(TfrmPrincipal, frmPrincipal);
Application.Run;
end;
end.
GOSTEI 1

Mais Respostas

Pedro Deola

Pedro Deola

09/09/2020

Muito Top este link Celso, consegui fazer estudando este exemplo.

Para quem precisar vou simplificar meu exemplo

No arquivo .DPR
uses
  Messages;

 var handle: Thandle;
 var copyDataStruct: TCopyDataStruct ;
begin

handle := FindWindow('TFORM_SENHA',nil);
if handle<>0 then begin
  SendMessage(handle, WM_COPYDATA, Integer(handle), Integer(@copyDataStruct)) ;
end   Else     begin
      Application.Initialize;
...
end;



onde TFORM_SENHA é o formulário que estou buscando.


Já no formulário TFORM_SENHA
  private
       procedure WMCopyData(var Msg : TWMCopyData) ; message WM_COPYDATA;


implementation

procedure TFORM_SENHA.WMCopyData(var Msg: TWMCopyData);
begin
   FORM_SENHA.Show;
   Application.BringToFront;
   FORM_SENHA.WindowState := wsMaximized;
end;





Abraços.
GOSTEI 1
Celso Lenon

Celso Lenon

09/09/2020

Muito Top este link Celso, consegui fazer estudando este exemplo.

Para quem precisar vou simplificar meu exemplo

No arquivo .DPR
uses
  Messages;

 var handle: Thandle;
 var copyDataStruct: TCopyDataStruct ;
begin

handle := FindWindow('TFORM_SENHA',nil);
if handle<>0 then begin
  SendMessage(handle, WM_COPYDATA, Integer(handle), Integer(@copyDataStruct)) ;
end   Else     begin
      Application.Initialize;
...
end;



onde TFORM_SENHA é o formulário que estou buscando.


Já no formulário TFORM_SENHA
  private
       procedure WMCopyData(var Msg : TWMCopyData) ; message WM_COPYDATA;


implementation

procedure TFORM_SENHA.WMCopyData(var Msg: TWMCopyData);
begin
   FORM_SENHA.Show;
   Application.BringToFront;
   FORM_SENHA.WindowState := wsMaximized;
end;





Abraços.

Top seu Exemplo!!!
GOSTEI 0
POSTAR