Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0343: Kein zweites Starten des eigenen Programmes erlauben

 von 

Beschreibung 

Es wurde ein Fehler im Sourcecode entfernt, der die Wirkungsweise des Tipps umgekehrt und den Tipp an sich somit unnütz gemacht hat.
Zudem wurde die Kommentierung erweitert.

Update am 06.02.2012: Dieser Tipp wurde von Henrik Ilgen mithilfe des Tippuploads überarbeitet und ersetzt.

Dieser Tipp funktioniert entweder nur in kompilierter Form oder benötigt eine DLL/OCX-Datei. Diese Binärdateien sind dem Tipp hinzugefügt worden, um seinen Funktionsumfang darstellen zu können. Vor dem Upload wurden sie auf Viren geprüft.

Zu diesem Tipp existieren im Tippupload die folgende(n) Aktualisierung(en):
[VB 5/6 Tippvorschlag 0450] Kein zweites Starten des eigenen Programmes erlauben

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

FindWindowA (FindWindow), ShowWindow

Download:

Download des Beispielprojektes [2,66 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.
' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
' ------------- Anfang Projektdatei Project1.vbp -------------
' --------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Rahmensteuerelement "Frame1"
' Steuerelement: Schaltfläche "Command1" auf Frame1
' Steuerelement: Beschriftungsfeld "Label1" auf Frame1
Option Explicit

Private Sub Command1_Click()

    Unload Me
    
End Sub

' ---------- Ende Formular "Form1" alias Form1.frm  ----------
' --------- Anfang Modul "Module1" alias Module1.bas ---------
Option Explicit

Private Const SW_MAXIMIZE As Long = 3&
Private Const SW_MINIMIZE As Long = 6&
Private Const SW_RESTORE  As Long = 9&

Private Declare Function ShowWindow Lib "user32" ( _
                         ByVal hWnd As Long, _
                         ByVal nCmdShow As Long) As Long
                         
Private Declare Function FindWindow Lib "user32" _
                         Alias "FindWindowA" ( _
                         ByVal lpClassName As String, _
                         ByVal lpWindowName As String) As Long
                         
Public Sub Main()

    Dim MemTitle As String
    Dim hWnd As Long
    
    ' Überprüfen, ob das Programm in der IDE ausgeführt wird (da es dort
    ' nicht funktioniert)
    If IsIDE() Then
    
        Call MsgBox("Dieses Programm kann nur als Kompilat ausgeführt " & _
            "werden.")
            
        Exit Sub
        
    End If
    
    ' Feststellen, ob bereits eine Instanz läuft
    If App.PrevInstance Then
    
        ' Den Anwendungstitel zwischenspeichern
        MemTitle = App.Title
        
        ' Den eigenen Titel ändern (damit sich das Programm nicht selbst
        ' findet)
        App.Title = "%&irgendwas"
        
        ' Sucht Applikation und stellt sie wieder her
        hWnd = FindWindow(vbNullString, MemTitle)
        
        Call ShowWindow(hWnd, SW_RESTORE)
        Call AppActivate(MemTitle)
        
    Else
    
        ' Es wurde keine andere Instanz gefunden - Hauptfenster anzeigen
        Call Form1.Show
        
    End If
    
End Sub

Public Function IsIDE()

    On Error Resume Next
    Debug.Assert 1 / 0
    
    If Err.Number <> 0 Then IsIDE = True
    
End Function

' ---------- Ende Modul "Module1" alias Module1.bas ----------
' -------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 17 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Hans Matthias Kleuker am 19.07.2009 um 14:23

Das Programm läuft bei mir so nicht. Aus meiner Sicht müsste aus der Zeile "If Not App.PrevInstance Then" das "Not" entfernt werden.

Ich benutze VB6 mit NT4.

Grüße
Hans Matthias

Kommentar von swat am 27.04.2007 um 20:36

Mal davon abgesehen, Angela, macht man das nicht ( = "Wahr", stattdessen = True. Ausserdem als Boolean definieren!). Denn auf einem anderssprachigem System würde das nicht funktionieren.
Dafür ist die Lösung von Oliver am besten.

Kommentar von Oliver Meyer am 27.04.2007 um 11:25

Hallo Angela Dein Tipp ist schon gut, für alle die es gaanz einfach haben wollen, aber er funktioniert doch auch so:

Private Sub Form_Load()
If App.PrevInstance Then
MsgBox " Aber Hallo ....... " & vbCrLf & " Eine Instanz läuft doch schon "
End
End If
End Sub

+Oliver

Kommentar von Frank am 25.04.2007 um 08:15

Aber Hallo Angela, ich möchte den Anwender doch keine MsgBox anbieten, sondern die 1.Instanz und die 2.soll wieder beendet werden.
Gruß Frank

Kommentar von Angela am 24.04.2007 um 22:34

hallo,
ich finde dies Forum sehr gut.
Manchmal frage ich mich, warum immer alles so kompliziert sein muß.
Tipp 0343 funktioniert doch auch so:
[code]

Private Sub Form_Load()

NZ$ = Chr$(13) + Chr$(10)
X = App.PrevInstance
If X = "Wahr" Then ' es läuft bereits eine Instanz dieses Programmes
A$ = " Aber Hallo ....... " + NZ$ + " Eine Instanz läuft doch schon "
MsgBox A$
End
End If

End Sub

Kommentar von Daniel Greuter am 04.03.2007 um 16:59

Lösung gefunden :

Es wird bei FindWindow nicht nach App.Title, sondern nach Window.Caption gesucht, was bei mir nicht gleich war !

Für SysTray kann ev. :
if IsIconic(hWnd) then OpenIcon(hWnd) helfen

Kommentar von Daniel Greuter am 04.03.2007 um 13:55

Hallo,
habe das gleiche Problem wie Zahlenwächter,
gibt es eine Lösung ?
Gruss, DG

Kommentar von Zahlenwächter am 21.03.2006 um 14:33

hi,
habe folgendes Problem dass sich mein Programm direkt nach dem Starten in den Systray minimiert und so der FindWindow Befehl nichts ausrichten kann.

Kann mir jemand helfen?
Vielen Dank für eure Antworten.

MFG Zahlenwächter

Kommentar von frankk am 21.04.2005 um 12:59

Bitte Not entfernen!

If Not App.PrevInstance Then -> If App.PrevInstance Then

Gruß Frank

Kommentar von illi am 17.11.2004 um 19:05

ist da nicht was falsch rum?
-->If Not App.PrevInstance Then

Kommentar von Felix Weiß am 26.09.2003 um 13:14

Das mit Flags ist vielleicht nicht die beste Lösung, aber im Schlüssel HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce
die exe-Datei reinschreibst und abfragst. Bei einem Absturz wird da Programm wieder aufgerugfen und der Schlüssel gelöscht.

Kommentar von TheFrogg am 14.07.2003 um 13:46

Ich habe ein absolut komisches phänomen:

Wenn ich die Beispiel-Datei ausführe, dann funktioniert diese. Wenn ich jedoch den Code in ein neues Projekt einfüge und dies ausführe geht gar nichts mehr?!?!?

Kann mir jemand sagen was ich falsch mache??

Wäre glücklich über eine prompte Antwort, hier oder auf meine E-mail.

Thx & Greez
TheFrogg

Kommentar von garth am 13.12.2002 um 00:13

hallo
ich wolte denn code das mein program nicht zweimal gestartet werden kan in mein Program mit einbauen und jetzt kann ich mein program nicht mehr Veröffentlichen . woran kan das liegen?
ich habe VB6 auf einen Win2k system

Kommentar von Dirk am 08.03.2002 um 21:19

Genau das gelcihe wie Roland wollte ich auch fragen!

Kommentar von Wolfgang Ranzmaier am 23.07.2001 um 16:01

Im Up-Download-Bereich habe ich ein eispiel gestellt, wo dieses Problem für alle Betriebssysteme auf sichere Art und Weise gelöst wurde. Suche dort nach "OneInstance".

Kommentar von Andreas Bein am 03.07.2001 um 17:15

OK.
Problem ist nur, daß die App.PrevInstance = False ist, wenn das 'gleiche' (Kopie) Programm aus unterschiedlichen Verzeichnissen 2mal gestartet wird. Und das Feststellen anhand des Fenstertitels ist ja auch so eine unsichere Sache. Gibt's noch mehr Lösungen, außer in der Registry (oder sonstwo) ein Flag auf 'Running' zu setzen und dies jedesmal noch abzufragen. Ist besonders blöde, wenn das Programm abstürzt und das Flag nicht zurückgesetzt werden kann. MfG Andi

Kommentar von Roland Jaeggi am 14.03.2001 um 00:30

Mein Problem: Beim Doppelklicken auf eine Textdatei im Explorer startet meine Applikation und öffnet die Datei. Mit obigem Tip kann ich verhindern, dass die Applikation ein zweites Mal startet, wenn ich eine weitere Datei doppelklicke. Wie aber bringe ich der bereits gestarteten Applikation bei, dass sie die zweite Datei ebenfalls öffnen soll?