Das Windows-API kennt in der Regel keine Visual Basic- oder
COM-Objekte. Genau so wenig kennt es Steuerelemente als Objekte. Da
Sie es bei (den meisten) Steuerelementen mit Fenstern zu tun haben,
kennt das API diese unter ihrem Fenster-Handle hWnd. Wenn Sie nun
ein solches Fenster-Handle vorliegen haben, bleibt die Frage, wie
Sie das dazugehörige Steuerelement(-Objekt) finden
können.
Eine Möglichkeit wäre, die in der Controls-Auflistung eines
Forms enthaltenen Steuerelemente zu durchlaufen und jeweils deren
Handle mit dem vorhandenen Handle zu vergleichen (Damit dabei
fensterlose Steuerelemente keinen Laufzeitfehler auslösen, werden
diese Fehler mit einem vorsorglichen On Error Resume Next
übersprungen):
Dim nControl As Control
Dim nWnd As Long
On Error Resume Next
For Each nControl In Controls
nWnd = nControl.hWnd
If nWnd = hWndGegeben Then
Exit For
End If
Next
Das geht jedoch einfacher. Windows vergibt nämlich selbst jedem
Steuerelement beim Anlegen eine so genannte ControlID als eigene
Nummer. Diese Nummer können Sie mit der API-Funktion GetDlgCtrlID
herausinden, indem Sie ihr das vorhandene Handle übergeben. Im
Gegensatz zur Index-Nummerierung in der Controls-Auflistung, die mit
0 beginnt, startet die ControlID-Nummerierung jedoch bei
1. Die Funktion GetDlgCtrlID gibt nämlich den Wert 0
zurück, wenn ihr ein ungültiges Handle übergeben worden ist.
Die Hilfs-Funktion ControlFromHandle verwendet diese API-Funktion
und gibt Ihnen das gesuchte Control zurück.
Private Declare Function GetDlgCtrlID Lib "user32" _
(ByVal hWnd As Long) As Long
Public Function ControlFromHandle(Form As Form, _
ByVal hWnd As Long) As Control
Dim nID As Long
nID = GetDlgCtrlID(hWnd)
If nID > 0 Then
Set ControlFromHandle = Form.Controls(nID - 1)
End If
End Function
 |
Mit der Hilfs-Funktion ControlFromHandle
ermitteln Sie ein Steuerelement anhand eines gegebenen
Fenster-Handles

|

|