Rubrik: Verschiedenes / Sonstiges | VB-Versionen: VB4, VB5, VB6 | 13.08.02 |
Prüfen, ob die eigene Anwendung deaktiviert wurde Dieses Beispiel zeigt, wie sich feststellen lässt, wann die eigene Anwendung deaktiviert wurde. | ||
Autor: Dieter Otter | Bewertung: | Views: 13.551 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Das Form-Objekt verfügt über vielfältige Ereignisse - unter anderem findet man auch das Deactivate-Ereignis. Dieses Ereignis wird immer dann ausgelöst, wenn die Form selbst nicht mehr die aktive Form ist. Nun sollte man glauben, dass man das Deactivate-Ereignis also auch dazu verwenden kann, um zu prüfen, ob eine andere Anwendung aktiviert wurde:
Private Sub Form_Deactivate() MsgBox "Anwendung wurde deaktiviert!" End Sub
Starten Sie ein Projekt und fügen obigen Code in den Codeteil der Form1 ein. Starten Sie nun das Programm und aktivieren anschließend irgendeine beliebige andere Anwendung. Laut unserem Quellcode sollte nun eine MsgBox mit dem Text "Anwendung wurde deaktiviert!" erscheinen.
Doch weit gefehlt!. Warum? Das Deactivate-Ereignis wird immer nur dann ausgelöst, wenn eine andere Form innerhalb der eigenen Anwendung aktiviert wird - nicht also eine fremde Anwendung.
Was nun? Eine Möglichkeit wäre das ganze über einen Timer und der API GetForegroundWindow abzufragen.
Löschen Sie den bisherigen Code aus dem Codeteil der Form und fügen stattdessen folgenden Code ein:
Option Explicit ' zunächst die benötigte API-Deklaration Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Sub Form_Load() ' Timer initialisieren Timer1.Enabled = False Timer1.Interval = 150 End Sub
Private Sub Form_Activate() ' Timer starten Timer1.Enabled = True End Sub
Private Sub Timer1_Timer() ' Prüfen, ob Anwendung deaktiviert wurde If GetForegroundWindow() <> Me.hWnd Then MsgBox "Anwendung wurde deaktiviert!" Timer1.Enabled = False End If End Sub
Wenn Sie nun das Projekt starten und anschließend eine beliebige andere Anwendung aktivieren, erscheint - wie gewünscht - die MsgBox mit dem Text "Anwendung wurde deaktiviert!".
Nun ergibt sich aber wieder ein Problem Die MsgBox erscheint nur ein einziges Mal - auch wenn wir die Anwendung zwischenzeitlich wieder aktivieren und anschließend deaktivieren.
Abhilfe schafft hier folgende Änderung am obigen Code:
Private Sub Timer1_Timer() ' Prüfen, ob Anwendung deaktiviert wurde If GetForegroundWindow() <> Me.hWnd Then If Timer1.Tag <> "Deactivated" Then MsgBox "Anwendung deaktiviert!" Timer1.Tag = "Deactivated" End If Else If Timer1.Tag <> "" Then MsgBox "Anwendung wurde wieder aktiviert!" Timer1.Tag = "" End If End If End Sub
Wir merken uns einfach den aktuellen Status in der Tag-Eigenschaft des Timers. Ist die Anwendung aktiv, also aktiviert, setzen wir Timer1.Tag = "" - andernfalls Timer1.Tag = "Deactivate". Auf diese Weise können wir genau feststellen, wann unsere Anwendung deaktiviert und wieder aktiviert wurde.