Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
629
Assunto : VB.NET
Titulo: Impedindo que duas cópias da aplicação sejam iniciadas

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



As classes do Framework realizam para nós muitas tarefas que antes só poderíamos fazer via API's. Uma dessas tarefas é a manipulação de processos do sistema operacional, que podemos fazer através do namespace System.Diagnostics

A classe Process do namespace System.Diagnostics possui um método shared getCurrentProcess que nos permite obter uma referência ao processo atual em que a aplicação está rodando. Com esta referência podemos pesquisar o título do processo que está sendo aberto agora entre os processos já abertos para descobrirmos se a aplicação já havia sido aberta antes ou não.

No load do form principal da aplicação podemos utilizar o seguinte código :

If
UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurre
ntProcess.ProcessName)) > 0 Then


ActivatePrevInstance(Me.text)
End If


O IF já é suficiente para identificar se a aplicação já está carregada ou não. A sub ActivatePrevInstance é um a mais que nos permite ativar a instância anterior da aplicação. Então vamos ver como implementar essa sub, ActivatePrevInstance

Para implementar esta sub precisaremos estar fazendo uso direto de API's do Windows através do VB.NET. Isso porque não temos nas classes um método direto que nos permita ativar um outro processo do windows.

A localização do processo, porém, é simples. Usamos o método shared GetProcesses, da classe Process, e fazemos um loop para localizar o processo pelo título do form.

Veja como fica :

''Declarations of Windows API functions
Declare Function OpenIcon Lib "user32" (ByVal hwnd As Long) As Long
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As
Long


Sub ActivatePrevInstance(ByVal argStrAppToFind As String)
Dim PrevHndl As Long
Dim result As Long

Dim objProcess As New Process 'Variable to hold individual Process
Dim objProcesses() As Process 'Collection of all the Processes
running on local machine
objProcesses = Process.GetProcesses() ''Get all processes into the
collection

For Each objProcess In objProcesses
''Check and exit if we have SMS running already
If UCase(objProcess.MainWindowTitle) = UCase(argStrAppToFind)
Then
MsgBox("Another instance of " & argStrAppToFind & " is
already running on this machine. You cannot run TWO instances at a time.
Please use the other instance.")
PrevHndl = objProcess.MainWindowHandle.ToInt32()
Exit For
End If
Next
If PrevHndl = 0 Then Exit Sub 'if No previous instance found exit
the application.
''If found
result = OpenIcon(PrevHndl) 'Restore the program.
result = SetForegroundWindow(PrevHndl) 'Activate the application.

End 'End the current instance of the application.
End Sub


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 10/14/2016 11:56:00 PM
nome: JGPEfPESOdGXGDQo
email: jimos4581rzt@hotmail.com
comentário:
qzlW9m http://www.FyLitCl7Pf7kjQdDUOLQOuaxTXbj5iNG.com

data: 10/14/2016 11:22:00 PM
nome: ggUoJqfIgpg
email: jimos4581rzt@hotmail.com
comentário:
xKxpX6 http://www.FyLitCl7Pf7kjQdDUOLQOuaxTXbj5iNG.com

data: 8/8/2016 7:47:00 AM
nome: wzSDDoyDBjJXJWzA
email: jimos4581rt@hotmail.com
comentário:
bsxsga http://www.FyLitCl7Pf7kjQdDUOLQOuaxTXbj5iNG.com

 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br