RSS
StartseiteKnowledge LibraryTop 10Impressum

4.7 Wie ermittel ich den Handle eines externen Fensters?

VB4-VB6

Von:  [Home]

Wie Sie die Handles (Interne Zugriffsnummern oder Geräteindex) eines Forms aus Ihrer eigenen Anwendung auslesen können ist Ihnen vielleicht bekannt. Dies geschieht normalerweise über die hWnd-Eigenschaft des entsprechenden Objekts. So können Sie zum Beispiel den Handle von "Form1" auslesen:

Dim MyHandle As Long
MyHandle = Form1.hWnd

Was ist aber wenn Sie ein Handle eines Fensters benötigen, welches gar nicht zu Ihrer Anwendung gehört? Hier hilft nur das API weiter. Einige API-Funktionen, welche Handles auslesen können werden im Nachfolgenden genauer erklärt.

Eine sehr einfache und bekannte API ist die FindWindow-Funktion. Sie erwartet nur 2 Parameter, gibt sich aber auch mit einem einzigen zufrieden. Sie müssen hier entweder die interne Klassenbezeichnung des Fensters wissen oder den Titelleistentext. Die Klassenbezeichnung können Sie z.B. mit dem Tool Spy++ in Erfahrung bringen. Die Deklaration und ein Beispiel:

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

Dim FensterHandle As Long

FensterHandle = FindWindow(vbNullString, "Ausführen")

Debug.Print FensterHandle

In diesem Beispiel wird ein Fenster mit dem Titelleistentext "Ausführen" (zweiter Parameter) gesucht und der Handle als Long-Wert in die Variable FensterHandle gespeichert. Der erste Parameter (die Klassenbezeichnung) ist unbekannt und bekommt daher keine Daten "vbNullString" mit auf dem Weg. Auf diese Weise können Sie mit Hilfe der Klassenbezeichnung und/oder des Titelleistentextes eines Fensters den dazugehörigen Handle auslesen und nutzen.

Übrigens: Wenn die Funktion eine 0 (Null) zurückgibt, dann wurde das entsprechende Fenster mit den beiden Parameterangaben nicht gefunden.

Die erweiterte Funktion FindWindowEx, erlaubt eine genauere Suche nach einem Fenster. So kann hier angeben, wo die Suche nach einem Fenster beginnen soll, sinnvoll für die Suche nach einem Fenster untergeordneten Steuerelementen. In folgendem Beispiel wird der Handle der ComboBox zurückgegeben, die sich im Fenster "Ausführen" befindet:

Private Declare Function FindWindowEx Lib "user32" _
        Alias "FindWindowExA" ( _
        ByVal hWndParent As Long, _
        ByVal hWndChildAfter As Long, _
        ByVal lpszClass As String, _
        ByVal lpszWindow As String _
              ) As Long

Dim FensterHandle As Long
Dim ComboHandle   As Long

FensterHandle = FindWindowEx(0, 0, vbNullString, "Ausführen")
ComboHandle = FindWindowEx(FensterHandle, 0, "ComboBox", vbNullString)

Debug.Print ComboHandle

Eine weitere Möglichkeit, um einen Handle auszulesen, bietet die WindowFromPoint-Funktion. Dieser wird - wie der Name schon sagt - eine Bildschirmkoordinate übergeben. Zurückgegeben wird der Handle des Objektes, das sich an der übergebenen Koordinate befindet. Deklaration und Anwendungsbeispiel:

Private Declare Function WindowFromPoint Lib "user32" ( _
        ByVal x As Long, _
        ByVal y As Long _
              ) As Long

Dim HandleFromPoint As Long
HandleFromPoint = WindowFromPoint(10, 20)   ' x- und y-Wert

Dieses Beispiel gibt den Handle des Fensters zurück, welches sich auf der Bildschirmkoordinate 10/20 (Angaben in Pixel) befindet. Die Koordinaten können z.B. auch über die API Funktion GetCursorPos ermittelt werden, um in Erfahrung zu bringen, welches Fenster sich unter dem Mauszeiger befindet.

Es gibt zig API-Funktionen mit denen Sie auf andere Art und Weise Handles ermitteln können. Dieser Artikel soll nur einen Einstieg mit dem Umgang von Handles und dem API erleichtern.