Wer mit Api-Funktionen arbeitet, stellt sehr bald fest, dass die meisten Funktionen den Handle auf ein Element, ein Fenster, haben wollen.

Im Gegensatz zu VB6-Forms, haben VBA-Userforms von MS keinen Handle mitbekommen.

Das bedeutet nicht, dass das Fenster keinen besitzt; nur, dass es etwas mehr Aufwand erfordert, an den Handle zu kommen.

Wer zum Thema 'Userform','handle' im I-Net sucht wird feststellen, dass es viele angebotene Lösungen gibt.

Letzendlich läuft's auf ein FindWindow/FindWindowEx plus zusätzlichen Plausibilitätsprüfungen. Also zunächst:

 

Dim hWnd_UF as long
hWnd_UF = FindWindow("ThunderDFrame", UserForm1.Caption)

 

Damit bekommt Windows den Auftrag ein Fenster vom Typ 'ThunderDFrame' zu finden, dass den Titel 'UserForm1.Caption' trägt.

(Nota: Den Typ 'ThunderDFrame' liefert das C++ - Tool 'Spy++' zurück.)

Nicht das Fenster; nur eines. Wird Windows fündig, wird der Handle an die Variable hWnd_UF übergeben. Fertig.

Ob's noch andere Fenster gibt, die die Bedingungen erfüllen, wird nicht geprüft.

 

Die Ansätze, wie's nun weitergeht, variieren stark. Je nach Temperament, wird mehr oder weniger Aufwand betrieben um die Richtigkeit der Auswahl zu bestätigen.

Eine Variante ist, dem Fenstertitel(Caption) einen eindeutigen String anzuhängen(hier); andere machen gar nix, der Logik folgend, dass die Wahrscheinlichkeit gering ist.(hier und hier).

Persönlich tendiere ich zur Einfachlösung, also:

 

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

Private Sub UserForm_Initialize()

   Dim hWnd_UF As Long


   hWnd_UF = FindWindow("ThunderDFrame", Me.Caption)
   MsgBox hWnd_UF

End Sub

Dabei stets im Hinterkopf behalten, dass das Ergebnis nicht 100%-ige Eindeutigkeit besitzt.

Zum Seitenanfang