Wenn Sie in Erfahrung bringen möchten, ob das Hauptfenster, in dem sich ein Steuerelement befindet, gerade das aktive Fenster des Systems ist, können Sie im einfachsten Fall das Fenster-Handle des Eltern-Forms mit dem von der API-Funktion GetForegroundWindow gelieferten Handle auf Übereinstimmung hin vergleichen. Die benötigte Referenz auf das Eltern-Form eines Steuerelements erhalten Sie normalerweise über die Parent-Eigenschaft eines Steuerelements.
Doch bei einem Steuerelement, das auf einem UserControl platziert ist, liefert Ihnen die Parent-Eigenschaft des Steuerelements eine Referenz auf eben dieses UserControl. Sie könnten zwar nun innerhalb des UserControls über die Parent-Eigenschaft des Extender-Objekts an das Eltern-Form gelangen - falls nicht zufällig auch dieses UserControl wiederum auf einem anderen UserControl platziert ist. Die Visual Basic-eigenen Mechanismen mit ihrer uneinheitlichen Interpretation des Parent-Objekts kann Ihnen offensichtlich so nicht zum Ziel bringen.
Doch da wir mit der API-Funktion GetForegroundWindow schon in die API-Kiste greifen, können wir auch noch ein weiteres Mal hinein greifen und dabei die Funktion GetParent hervorziehen. Diese liefert Ihnen jeweils das Handle des Eltern-Fensters zu einem gegebenen Handle. In einer Do...Loop-Schleife können Sie nun Eltern-Ebene für Eltern-Ebene so lange aufwärts marschieren, bis GetParent kein Eltern-Handle mehr ermitteln kann und daher den Wert 0 zurückgibt. Damit wäre das Handle der zuletzt ermittelten Eltern-Ebene das gesuchte Handle des Eltern-Forms, das Sie nun mit dem Rückgabewert von GetForegroundWindow vergleichen können.
Die folgende Hilfsfunktion IsCtlParentFormActive hangelt sich für Sie durch die Ebenen und nimmt auch den besagten Vergleich vor:
Private Declare Function GetParent Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Public Function IsCtlParentFormActive(Control As Control) As Boolean
Dim nParentWnd As Long
Dim nWnd As Long
On Error Resume Next
nWnd = Control.hwnd
If Err.Number Then
Err.Raise 5
End If
On Error GoTo 0
Do
nParentWnd = GetParent(nWnd)
If nParentWnd = 0 Then
IsCtlParentFormActive = CBool(GetForegroundWindow() = nWnd)
Else
nWnd = nParentWnd
End If
Loop While nParentWnd
End Function
|