Manchmal ist es sinnvoll zu verhindern, dass die eigene Anwendung mehrfach gestartet und gleichzeitig ausgeführt wird. Wie man prüfen kann, ob bereits eine Instanz "läuft", wissen wahrscheinlich die meisten. Hierzu fragt man einfach die Eigenschaft PrevInstance (Previous Instance) des App-Objekts ab. Ist diese True, so wird zum aktuellen Zeitpunkt die eigene Anwendung bereits ausgeführt. In diesem Fall könnte man ja dann einfach einen Hinweis anzeigen, dass ein mehrfaches gleichzeitiges Ausführen der Anwendung nicht möglich ist, und beendet dann anschliessend die aktuelle "Sitzung". Das ganze würde so aussehen: Public Sub Main() ' Prüfen, ob Anwendunng bereits gestartet If App.PrevInstance Then MsgBox "Achtung!" & vbCrf & _ "Es läuft bereits eine Instanz dieser Anwendung." & _ vbCrLf & vbCrLf & _ "Ein mehrfaches gleichzeitiges Ausführen ist " & _ "nicht möglich!" ' Anwendung beenden End End if ... End Sub So, das ganze funktioniert auch schon. Aber: Wäre es nicht eleganter, im Falle, dass bereits eine Instanz ausgeführt wird, diese sofort zu aktivieren und in den Vordergrund zu bringen - ohne den lästigen Hinweis anzuzeigen? Ja?
Für das Ermitteln des Fenster-Handles greifen wir (wieder einmal) auf das Windows API zurück. Hier gibt es die Funktion FindWindow. Dieser Funktion übergeben wir den Fenster-Titel unserer bereits gestarteten Anwendung, und erhalten zurück - das Handle des Fensters. Eine weitere API-Funktion (SetForegroundWindow) bringt unsere Anwendung dann in den Vordergrund. Und hier der Code: ' benötigte API-Deklarationen 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 ' Start-Prozedur Public Sub Main() ' Prüfen, ob Anwendunng bereits gestartet If App.PrevInstance Then ' Ja! Jetzt Fenster-Handle ermitteln Dim RetVal As Long RetVal = FindWindow(vbNullString, _ "Fenster-Titel Ihrer Anwendung") If RetVal <> 0 Then ' Anwendung gefunden - jetzt aktivieren Call SetForegroundWindow(RetVal) End If ' zweite Instanz beenden End End If ... End Sub Beispiel Wir haben den obigen Code für unser Menüprogramm sogar noch ein klein wenig ausgebaut. Da die Anwendung evtl. minimiert ist, benötigen wir eine Funktion, um die zu aktivierende Anwendung maximiert (oder normal) darzustellen. Auch hier hilft das Windows API wieder mit einer entsprechenden Funktion - ShowWindow. Und hier der Code, wie wir ihn für das CD-Menüprogramm verwendet haben: ' benötigte API-Deklarationen 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() ' Prüfen, ob Anwendunng bereits gestartet If App.PrevInstance Then ' Ja! Jetzt Fenster-Handle ermitteln Dim RetVal As Long RetVal = FindWindow(vbNullString, _ "vb@rchiv CD Vol.1 - Das große Visual-Basic " & _ "Archiv - www.vbarchiv.de") If RetVal <> 0 Then ' Anwendung gefunden - jetzt aktivieren Call SetForegroundWindow(RetVal) ' Anwendung maximieren! Call ShowWindow(RetVal, SW_MAXIMIZE) End If ' zweite Instanz beenden End End If ... End Sub Hinweis zur FindWindow Funktion Dieser Tipp wurde bereits 50.017 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 TOP! Unser Nr. 1 Neu! sevDataGrid 3.0 Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |