Abrindo um aplicativo só uma vez.

Para verificar se ja existe uma instância de sua aplicação VB rodando geralmente você usa a propriedade PrevInstance.

A propriedade PrevInstance retorna um valor indicando se já existe uma instância de sua aplicação rodando. A sintaxe é a seguinte:

objeto.PrevInstance
       Ex: App.PrevInstance

onde no lugar de objeto usamos o objeto App.

O objeto App é um objeto gobal que nos dá informação sobre o título, versão , caminho , nome do executavel e arquivo de ajuda e ainda nos informa se uma instância da aplicação já esta sendo rodada.

Geralmente você usa esta instrução no evento Load do formulário que inicia a aplicação e se o valor retornado for verdadeiro você encerra a aplicação que esta sendo carregada pois já existe uma instância da mesma rodando.

Mas e se ao invés de finalizar abruptamente a execução da segunda instância você chamasse a outra instãncia já aberta ? Vejamos como fazer usando as API´s:

1- inicie um novo projeto no VB e no formulário padrão insira as seguintes declarações referentes as API´s usadas:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

2- Agora no evento Load do formulário insira o seguinte código:

Private Sub Form_Load()
Dim titulo As String
Dim vhwnd As Long

If App.PrevInstance Then
  titulo = Me.Caption
  Me.Caption = ""

  vhwnd = FindWindow(vbNullString, titulo)
  Call ShowWindow(vhwnd, 9)

  Call SetForegroundWindow(vhwnd)
  End
End If

End Sub

Veja que sutilmente chamamos a primeira instância da aplicação em execução antes finalizar a segunda instãncia. Para que isto funcione é preciso que a janela do formulário possua um título.

Até a próxima...