Ir para conteúdo
  • Cadastre-se

Sistema com apenas uma instancia e restaura form


Ver Solução Respondido por Dfox,
  • Este tópico foi criado há 1938 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

boa tarde

tenho o seguinte código no meu sistema para evitar abrir varias instancias

var
  Handle: THandle;
begin
  Application.Initialize;
 // Evita carga dupla da aplicacao
  begin
    Handle := CreateMutex(nil, True, 'Dfox');
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      MessageDlg('O Sistema Dfox já está em execução',
          mtInformation, [mbOK], 0);
    if not IsWindowVisible(Handle) then begin
       ShowWindow(Handle, SW_RESTORE);
       SetForegroundWindow(Handle);
    end;
    if Handle <> 0 then CloseHandle(Handle);
       Application.Terminate;
       exit;
    end;
  end;

ele funciona bem, mas não restara o sistema com o comando ShowWinow alguém poderia me dar uma luz?

  • Fundadores
Postado
3 minutos atrás, Dfox disse:

ele funciona bem, mas não restara o sistema com o comando ShowWinow alguém poderia me dar uma luz?

Isso realmente não funciona, em algumas versões do windows...
Tente usar o método abaixo, da ACBrUtil.pas

function ForceForeground(AppHandle:{$IfDef FPC}LCLType.HWND{$Else}THandle{$EndIf}): boolean;

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado
18 minutos atrás, Daniel Simoes disse:

Isso realmente não funciona, em algumas versões do windows...
Tente usar o método abaixo, da ACBrUtil.pas

function ForceForeground(AppHandle:{$IfDef FPC}LCLType.HWND{$Else}THandle{$EndIf}): boolean;

 

Daniel valeu pela força, a função não deu certo!

  • Solution
Postado

de momento consegui resolver assim

   var
   MutexHandle: THandle;
   hwind:HWND;

    MutexHandle := CreateMutex(nil, True, 'Dfox');
    if MutexHandle <> 0 then
    begin
      if GetLastError = ERROR_ALREADY_EXISTS then
      begin
        MessageDlg('O Sistema Dfox já está em execução',
          mtInformation, [mbOK], 0);
        CloseHandle(MutexHandle);
        hwind := 0;
        repeat
          hwind := FindWindowEx(0,hwind,'TApplication','TfrmPrincipal');
        until (hwind<>Application.Handle);
        if (hwind<>0) then
        begin
          ShowWindow(hwind,SW_SHOWNORMAL);
          SetForegroundWindow(hwind);
        end;
        Halt;
      end
    end;

 

  • Curtir 1
Postado

na verdade o código final ficou assim

var
  Handle, HandleId: THandle;
 // Evita carga dupla da aplicacao
  begin
    Handle := CreateMutex(nil, True, 'Dfox');
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      MessageDlg('O Sistema Dfox já está em execução',
          mtInformation, [mbOK], 0);
      HandleId := FindWindow('TfrmPrincipal',nil);
    if not IsWindowVisible(Handle) then begin
       ShowWindow(HandleId, SW_RESTORE);
       SetForegroundWindow(HandleId);
    end;
    if Handle <> 0 then CloseHandle(Handle);
       Application.Terminate;
       exit;
    end;
  end;

 

  • Curtir 1
  • Consultores
Postado

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Este tópico foi criado há 1938 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...