Ir para o conteúdo
SLIFE

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

Mensagens Recomendadas

SLIFE    0
SLIFE

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
anolsi    16
anolsi

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).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
SLIFE    0
SLIFE

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vitortomaz    1
vitortomaz

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"?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
vitortomaz    1
vitortomaz

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!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
SLIFE    0
SLIFE

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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 ;)

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade