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.
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
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
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
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).