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

SLIFE

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

Recommended Posts

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


Sandro Coelho

Share this post


Link to post
Share on other sites
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).


"Nós somos o que fazemos repetidamente, a excelência não é um feito, e sim, um hábito."
Não respondo a questões por PM que possam ser colocadas no fórum!

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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


Sandro Coelho

Share this post


Link to post
Share on other sites
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"?

Share this post


Link to post
Share on other sites
SLIFE

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

Estou a fazer um Kill Process!

Existe outra maneira melhor?


Sandro Coelho

Share this post


Link to post
Share on other sites
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!

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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


Sandro Coelho

Share this post


Link to post
Share on other sites
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 ;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.