Ir para conteúdo
Fórum Script Brasil
  • 0

CreateMutex


cesar91

Pergunta

Como que eu faço para abrir 1x só o aplicativo, caso coloque para abrir 2x ele da SHOW no que já esta aberto?!

Estou usando esse code para abrir 1x só:

var
  Mutex : THandle;
  MyMsg : THandle;
begin
  MyMsg := RegisterWindowMessage('TFL');
  Mutex := CreateMutex(nil, True, 'TFL');
  if (Mutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    SendMessage(HWND_BROADCAST, MyMsg, 0, 0);
  end
  else
begin
  Application.Initialize;
...

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Opa

Faça assim que é mais fácil... ao invés de você "enviar msg" e ter que processar a mesma...

No Source do Programa, menu Project -> View Source coloque o seguinte código no começo de tudo

var
  hMutex: THandle;
begin
  hMutex := CreateMutex(nil, True, 'TFL');
  if (hMutex <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    ShowWindow(FindWindow('Classe do seu form principal', nil), SW_SHOW);
    CloseHandle(hMutex);
    Exit;
  end;
  Application.Initilize;
  ....
  // e lá embaixo na última linha antes do end.
  CloseHandle(hMutex); //Pra liberar esse Mutex ou seja, o programa foi fechado e pode abrir um outro

Bom fiz sem o Delphi aqui masss acredito que esteja tudo ok hehe

A Classe do seu form principal é assim, vamos supor que seu form principal se chame frmTFL então a classe é 'TfrmTFL'

O Delphi sempre coloca um T na frente, única maneira de colocar classe própria é dando um override no CreateParams...

abrs

Link para o comentário
Compartilhar em outros sites

  • 0

Churc, permita-me dar um pitaco por aqui...

Unico problema é que se ele está minimizado, quando da show, os botoes de minimizar, fechar, não funcionam
Este é um efeito colateral bem chato.

Um artigo interessante que vi faz pouco tempo, detalha bem as nuances sobre a verificação de instancias do programa em uso: Controlling the number of application instances

uma delas é o fato de que esta abordagem mais simples pode não ser segura, pelo fato de eventualmente você ter duas aplicações delphi na máquina e que tenham a classe do form principal com o mesmo nome.

Ainda há outra questão a ser lembrada que é quando o programa é executado via terminal server, quando este método não é viável, já que todas as instâncias solicitadas pelos usuários seriam iniciadas na mesma máquina (o servidor). Mas isto é uma situação eventual (imagino que você não se enquadre nesta situação).

Voltando a questão, e mantendo o método simples, dá para adaptar uma parte do código citada no artigo onde é criada uma mensagem customizada que será enviada para todas as aplicações e que, conforme programada, no seu código será entendida e utilizada para chamar o método Restore do objeto Application.

Código do projeto sugerido pelo amigo Churc ajustado:

var
  hMutex: THandle;
begin
  hMutex := CreateMutex(nil, True, 'TFL');
  MyMsg := RegisterWindowMessage(PChar('TFL'));  // criação da mensagem customizada
  if (hMutex <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    SendMessage(HWND_BROADCAST, MyMsg, 0, 0);  // enviando a mensagem para todas as aplicações
    Exit;
  end;
  Application.Initilize;
  ....
  // e lá embaixo na última linha antes do end.
  CloseHandle(hMutex); //Pra liberar esse Mutex ou seja, o programa foi fechado e pode abrir um outro
...
Na unit do form principal:
type
  TFormPrincipal = class(TForm)
    :
  private
    procedure WndProc(var Message: TMessage); override;
    :
  end;

var
  FormPrincipal: TFormPrincipal;
  MyMsg: Cardinal; // handle da mensagem customizada inicizada no projeto

:
procedure TFormPrincipal.WndProc(var Message: TMessage);
begin
  if Message.Msg = MyMsg then
  begin
    Application.Restore;  // restaura aplicação
    Message.Result := 1;  // mensagem processada
  end else
    Inherited;
end;
:
end.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...