Prüfung ob Programm ein 2.mal läuft

Hi
wollte mal fragen, wie man prüfen kann, ob ein Programm XYZ, wenn es 2x auf der Festplatte existiert, schon mal parallel gestartet wurde.

Also zB 1x XYZ.Exe auf C installiert, wurde gesatartet, dann ist das Programm XYZ.exe auch auf D und wird gestartet. Das Programm auf D soll dann eine Meldung bringen, das das Programm schon läuft.

Mfg Werner

Hallo Werner,

ein kleiner Auszug aus der MSDN.

PrevInstance-Eigenschaft
Gibt einen Wert zurück, der angibt, ob eine bestehende Instanz einer Anwendung bereits ausgeführt wird.

Syntax

Objekt.PrevInstance

Der Platzhalter Objekt stellt einen Objektausdruck dar, der ein Objekt in der Liste unter Betrifft ergibt.

Anmerkungen

Mit dieser Eigenschaft in einer Load-Ereignisprozedur können Sie herausfinden, ob ein Benutzer bereits eine Instanz einer Anwendung ausführt. Je nach Anwendung kann es sinnvoll sein, nur jeweils eine Instanz in der Windows-Umgebung auszuführen.

Ein Kleines Bsp.

Public Sub Main()
 ' Unter "Projekt" -\> "Eigenschaften" -\>
 ' "Allgemein" -\> "Startobjekt" muß "Sub Main"
 ' ausgewählt sein!

 ' Läuft bereits eine Instanz meiner Anwendung?
 If App.PrevInstance Then
 ' Ja, diese Instanz in den Vordergrund holen
 ' 'App.EXEName' muß durch die Beschriftung
 ' der Form (meist MDI.Caption) ersetzt werden,
 ' welche angezeigt wird.
 VBA.Interaction.AppActivate App.EXEName
 Else
 ' Nein, eine neue Instanz starten
 ' Hier die Hauptform (meist MDIForm) starten
 End If
End Sub

MfG Alex

Nochmal
Hallo
funktioniert das auch, wenn das Programm zweimal am selben Rechner
unter verschiedenen Pfaden installiert wurde???

Das war ja die eigentliche Frage.

Mfg Werner

Hallo Werner,

hmm gute Frage. Also ein Programm kann man eigentlich nicht 2 mal installieren :wink: Aber ich probiere mal schnell etwas aus und melde mich gleich wieder :smile:

MfG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Werner,

so da bin ich wieder. Also wenn du prüfen willst ob das Programm im Allgemeinen schon ein 2 mal gestartet ist ( Auch aus einen anderen Pfad hinaus) so geht diese Variante nicht mehr, da diese nur prüft ob das und nur das! prog schon einmal gestartet worden ist.
Aber wie es so in VB üblich ist, führen viele Wege nach Rom :smile:

Setze in deinem Prog die Starteigenschaft auf die Sub Main und kopiere dort deinen Code hinein, dann klappt es. Ich habe es getestet und das Prog einmal von c:\ und einmal von f:\ gestartet. Wenn das prog schon einmal gestartet wird, so wird dieses in den Vordergrund geholt und maximiert :smile:

Option Explicit

Private Declare Function FindWindow Lib "user32" Alias \_
 "FindWindowA" (ByVal lpClassName As String, \_
 ByVal lpWindowName As String) As Long

Private Declare Function ShowWindow Lib "user32" \_
 (ByVal hWnd As Long, ByVal nCmdShow As Long) \_
 As Long

Private Declare Function SetForegroundWindow Lib \_
 "user32" (ByVal hWnd As Long) As Long

Private Const SW\_NORMAL = &H1
Private Const SW\_MAXIMIZE = &H3

' Start-Prozedur
Public Sub Main()
Dim RetVal As Long
RetVal = FindWindow(vbNullString, "Fenster-Titel Ihrer Anwendung")
If RetVal 0 Then
 Call SetForegroundWindow(RetVal)
 Call ShowWindow(RetVal, SW\_MAXIMIZE)
 End
End If
'Hier dein Programm starten , bsp. Form1.show
End Sub

Aber Vorsicht diese Variante geht nicht, wenn sich dein Prog in dem Systemtray befindet. Wenn dies der Fall sein sollte, so melde dich nochmal. Dann muss ich mir mal noch einen Kopf machen, wie man es dann lösen koennte.

MfG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Einfacher???
Hallo
Kann man das auch etwas einfach gestalten.
Ich möchte ja nur ne Meldung, hallo Programm läuft schon, dann Ende
(der 2.gestarteten Version).

Mfg Werner

Hallo Werner,

das ist doch schon rel. kurz :smile:
Einen kuerzeren Weg kenne ich deinem Falle nicht :frowning:
Du könntest max. die zeilen

Private Const SW_NORMAL = &H1
Private Const SW_MAXIMIZE = &H3

herauslöschen und die Zeile

Call ShowWindow(RetVal, SW_MAXIMIZE)

in diese zeile abändern

Call ShowWindow(RetVal, &H3)

MfG Alex

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]