• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

SLIFE

[Resolvido] Evitar que aplicação seja aberta duas vezes

13 mensagens neste tópico

Boas a todos

Precisava de saber uma função que verifica-se se a minha aplicação já está aberta, e caso esteja dar uma mensagem a avisar o utilizador! E nao deixar abrir novamente.

Já estive de volta dos process, mas quando activo a opção de verificação, ele nao deixa correr o programa, fecha logo.

Se alguem poder ajudar agradeço

Cumprimentos

SLIFE

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

penso que cada instância da aplicação corre num novo processo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, creio que o PID é diferente de cada vez que inicias a aplicação. Mas uma maneira simples é colocar uma flag no registo do Windows a indicar que está aberto (se por alguma razão o teu programa não fechar correctamente essa flag ficará a indicar que o programa está aberto e precisas de ter um verificador ao iniciar, por exemplo, para a tornar correcta) ou verificar pelo nome do processo se está a ser executado (o grande problema deste último é se existirem dois com o mesmo nome).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não recomendo a sugestão do anolsi simplesmente porque não recomendo que se trabalhe com o registo do Windows a não ser que seja absolutamente necessário, o que não é caso.

Se executares a tua aplicação múltiplas vezes, vários processos da mesma vão existir correcto? O que tens a fazer é logo no inicio da execução da tua aplicação, sacas a lista de processo existentes no sistemas, verificas se a tua aplicação já se encontra a correr e pronto. Se já estiver a correr, lanças a mensagem para o utilizador e de seguida fazes Application.Exit(), caso contrário, continuas com o resto da execução.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não recomendo a sugestão do anolsi simplesmente porque não recomendo que se trabalhe com o registo do Windows a não ser que seja absolutamente necessário, o que não é caso.

Se executares a tua aplicação múltiplas vezes, vários processos da mesma vão existir correcto? O que tens a fazer é logo no inicio da execução da tua aplicação, sacas a lista de processo existentes no sistemas, verificas se a tua aplicação já se encontra a correr e pronto. Se já estiver a correr, lanças a mensagem para o utilizador e de seguida fazes Application.Exit(), caso contrário, continuas com o resto da execução.

Boas

Por acaso não tens nenhum exemplo de como poderei fazer isso?

E que no que eu fiz, ele não funcionava.

Era mais ou menos o que tu dizes.

Criei uma função, a qual chamo ao iniciar o form principal.

Essa função vai procurar nos processos, o nome do meu processo, e se o encontrar dá a msg ao utilizador.

O problema é que está sempre a dar a msg!

E quando faço para ele não arrancar por já existir outro processo com o mesmo nome, ele desliga o processo correcto mas também desliga o que não deve! Não sei se me estou a fazer entender!

Se tiveres um exemplo pratico agradecia, para poder ver o que esta mal no meu!

Cumprimentos

SLIFE

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas

Por acaso não tens nenhum exemplo de como poderei fazer isso?

E que no que eu fiz, ele não funcionava.

Era mais ou menos o que tu dizes.

Criei uma função, a qual chamo ao iniciar o form principal.

Essa função vai procurar nos processos, o nome do meu processo, e se o encontrar dá a msg ao utilizador.

O problema é que está sempre a dar a msg!

E quando faço para ele não arrancar por já existir outro processo com o mesmo nome, ele desliga o processo correcto mas também desliga o que não deve! Não sei se me estou a fazer entender!

Se tiveres um exemplo pratico agradecia, para poder ver o que esta mal no meu!

Cumprimentos

SLIFE

Como é que estás a "desligar o processo"?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como é que estás a "desligar o processo"?

Estou a fazer um Kill Process!

Existe outra maneira melhor?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Application.Exit() ou queres "matar" o outro processo e deixar esta ultima instância a correr?

Matar o outro não ma faz muito sentido já que pode estar no meio de alguma operação mas... depende do cenário!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Duas opções para fazeres isso:

1 – My Project – Application Tab e seleccionas a opção “Make Single Instante Application” no grupo “Window Application Framework Properties”. Isto fará com que a aplicação ganhe focus sempre que tentares iniciar outra vez e não cria uma nova instância.

2 - My Project – Application Tab e seleccionas o botão “View Application Events”. Depois utilizas o seguinte código:

Namespace My

    Partial Friend Class MyApplication

        Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
            ' Verifica o número de instancias da aplicação já a correr
            Dim p() As Process = Process.GetProcessesByName(My.Application.Info.AssemblyName)

            ' Caso sejam mais do que 1
            If p.Length > 1 Then

                MessageBox.Show("A aplicação já está a ser executada!")

                ' Cancela o processo de inicialização
                e.Cancel = True

            End If
        End Sub
      
    End Class

End Namespace

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Duas opções para fazeres isso:

1 – My Project – Application Tab e seleccionas a opção “Make Single Instante Application” no grupo “Window Application Framework Properties”. Isto fará com que a aplicação ganhe focus sempre que tentares iniciar outra vez e não cria uma nova instância.

2 - My Project – Application Tab e seleccionas o botão “View Application Events”. Depois utilizas o seguinte código:

Namespace My

    Partial Friend Class MyApplication

        Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
            ' Verifica o número de instancias da aplicação já a correr
            Dim p() As Process = Process.GetProcessesByName(My.Application.Info.AssemblyName)

            ' Caso sejam mais do que 1
            If p.Length > 1 Then

                MessageBox.Show("A aplicação já está a ser executada!")

                ' Cancela o processo de inicialização
                e.Cancel = True

            End If
        End Sub
      
    End Class

End Namespace

Boas jpaulino

Mais uma vez perfeito!

Obrigado!!!!!!!!!!!!!!

Funciona 100%

Das duas maneiras, embora considere a segunda melhor, pois podemos dar uma msg ao utilizador!

Obrigado pela dica!

Es um espetaculo!

Quem sabe, sabe. Quem nao sabe, pergunta aos que sabem....

Um abraço

SLIFE

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

outra forma é leres os processos que estao a ser executados, se 1 deles igual ao da tua app, ele mostra a mensagem e fecha-se.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

outra forma é leres os processos que estao a ser executados, se 1 deles igual ao da tua app, ele mostra a mensagem e fecha-se.

E isso não é o que está lá em cima ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora