# exe nur einmal öffnen



## -cta- (28. Oktober 2003)

hallo zusammen...

ich möchte, dass meine exe nur einmal geöffnet werden kann, bzw. nur eine instanz vorhanden ist....falls sie ein 2tes mal gesatrtet wird, soll eine meldung kommen und danach die gerade gestartete geschlossen werden...


ich kriege aber eine endlos schleife....

kann mal bitte jemand drüber schaun



```
Private Sub Form_Load()
    
    Dim i As Integer
    Dim intFileNummer As String
    Dim strDateiName As String
    Dim strInput As String
    
    'Prüfen, ob Anwendung bereits gestartet ist
    If App.PrevInstance Then
        'Ja! Jetzt Fenster-Handle ermitteln
        Dim RetVal As Long
        RetVal = FindWindow(vbNullString, _
          "ABC-Manager")
        If RetVal <> 0 Then
            ' Anwendung gefunden - jetzt aktivieren
            Call SetForegroundWindow(RetVal)
            MsgBox "Der ABC-Manager ist bereits geöffnet!"
            
        End If
        ' zweite Instanz beenden
        Unload ABCManagerFRMneu01
        
    End If

End Sub
```


----------



## Dario Linsky (28. Oktober 2003)

Ich bin mir nicht ganz sicher, ob das soweit ohne Probleme möglich ist, im Load-Event des Hauptformulars das Unload-Event aufzurufen. Probier es stattdessen einfach mal mit einem einfachen End (zum Beenden der ganzen Anwendung).


----------



## ANI (28. Oktober 2003)

Hallo,

ich habe ein Beispiel anbei gelegt. Schau Dir dies bitte an. Vielleicht hilft es Dir weiter.

ANI


----------



## -cta- (29. Oktober 2003)

so....ich habe jetzt das modul meinem projekt hinzugefügt...aber ich kann es trotzdem mehrfach öffnen......


----------



## -cta- (29. Oktober 2003)

> _Original geschrieben von Dario Linsky _
> *Ich bin mir nicht ganz sicher, ob das soweit ohne Probleme möglich ist, im Load-Event des Hauptformulars das Unload-Event aufzurufen. Probier es stattdessen einfach mal mit einem einfachen End (zum Beenden der ganzen Anwendung). *



das funktioniert auch nicht...da komme ich in eine endlosschleife der msgbox....


----------



## Retlaw (29. Oktober 2003)

Ich hab den ursprünglichen Code von -cta- getestet und mit ein paar Anpassungen läuft der bei mir wunderbar:

```
'Deklaration der API ausgelassen
Private Sub form_load() ' von Form1
    If App.PrevInstance Then
        Dim RetVal As Long
        RetVal = FindWindow(vbNullString, _
          "Form2")
        If RetVal <> 0 Then
            MsgBox "Die Anwendung ist bereits geöffnet!"
            Call SetForegroundWindow(RetVal)
        End If
        Unload Me
    Else
        Form2.Show
    End If
End Sub
```
Wenn das Programm schon läuft wird die gerade gestartete (neue) Instanz wieder mit Unload Me beendet.
Ich habe zwei Formulare verwendet, da FindWindow(...,"Form1") NICHT die schon laufende Instanz findet, sondern das "neue" Form1 der zweiten Instanz, welches gerade geladen wird. Dieses in den Vordergrund zu holen macht aber wenig Sinn  
Das Funktioniert wenn Form1 z.B. ein Startbildschirm ist und Form2 das Hauptfenster.
Sollte die Anwendung nur ein Fenster haben muss man obigen Code in eine Sub Main in ein Modul schreiben und das als Startobjekt unter Projekt => Eigenschaften angeben.
Nachdem das Modul auf andere Instanzen getestet hat kann es das Hauptfenster laden.


----------



## -cta- (29. Oktober 2003)

habs so geregelt:


```
Private Sub Form_Initialize()
  If App.PrevInstance Then
    MsgBox "Achtung!" & vbCrf & _
      "Der ABC-Manager kann nur einmal geöffnet werden!"
    ' Anwendung beenden
    End
  End If
End Sub
```


----------

