Ir para conteúdo
  • Cadastre-se

dev botao

Sistema com apenas uma instancia e restaura form


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

Recommended Posts

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?

Link para o comentário
Compartilhar em outros sites

  • Fundadores
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.

Link para o comentário
Compartilhar em outros sites

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!

Link para o comentário
Compartilhar em outros sites

  • Solution

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
Link para o comentário
Compartilhar em outros sites

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;

 

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1135 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...