Lieber Reinhard
Du hast auf meine damalige Frage umgehende eine Lösung angeboten, die auch wirklich perfekt funktioniert!
Nur: Bisher habe ich nur VBA-Prosa verstanden und geschrieben und deine Antwort ist VBA-Poesie, d.h. ich verstehe nix!
Kannst du mir bitte einen Tipp geben, wie/wo ich mich in dieser Richtung weiter entwickeln kann, damit ich solche Rosinen nicht nur geniessen, sondern vielleicht auch selbst züchten kann?
Auch andere Profis dürfen gern weiter helfen, es dankt euch
Erich
PS
Zur Erinnerung
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, \_
ByVal wCmd As Long) As Long
Private Declare Function GetClassName& Lib "user32" Alias \_
"GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName \_
As String, ByVal nMaxCount As Long)
Private Const GW\_CHILD = 5
Private Const GW\_HWNDNEXT = 2
Function ExcelInstanzen() As Long
Dim Länge&, Instanzen&, hwnd&
Dim Klassenname As String
hwnd = GetWindow(GetDesktopWindow, GW\_CHILD)
Do
Klassenname = String(51, 0)
Länge = GetClassName&(hwnd, Klassenname, 50)
If Left(Klassenname, Länge) = "XLMAIN" Then Instanzen = Instanzen + 1
hwnd = GetWindow(hwnd, GW\_HWNDNEXT)
Loop While hwnd 0
ExcelInstanzen = Instanzen
End Function
Hallo Erich,
richtig erklären kann ich das leider nicht. Es handelt sich um den Aufruf einer sogenannten API-Funktion und da habe ich keine Unterlagen über die vielen API-Funktionen, noch was da einzelne Übergabeparameter wie GW_CHILD, GW_HWNDNEXT usw bedeuten bzw. was sie bewirken. Die API-Funtionen stehen in *.dll Dateien.
Hier werden jetzt die API-Funktionen „GetDesktopWindow“ und „GetWindow“ aus der user32.dll benutzt, wie im Deklarationsteil ersichtlich.
Jeder Prozess der in Windows läuft hat wohl eine eindeutige Nummer, diese „hwnd“ und auch einen Fenstertitel. In der Schleife werden alle Fenstertitel ausgelesen und geprüft ob es Excel ist (xlmain) und demenstsprechend der Wert von Instanzen erhöht.
Ich ahbe schon öfters bei API-Funktionen gesehen, so auch hier, dass man da einen Leerstring, wie hier „Klassenname“, erstellt, dann wie hier die Funktion „GetClassName&“ aufruft, die dann diesen String befüllt und den kann man dann auswerten.
Gruß
Reinhard
Private Declare Function GetDesktopWindow Lib „user32“ () As
Long
Private Declare Function GetWindow Lib „user32“ (ByVal hwnd As
Long, _
ByVal wCmd As Long) As Long
Private Declare Function GetClassName& Lib „user32“ Alias _
„GetClassNameA“ (ByVal hwnd As Long, ByVal lpClassName _
As String, ByVal nMaxCount As Long)
Private Const GW_CHILD = 5
Private Const GW_HWNDNEXT = 2
Function ExcelInstanzen() As Long
Dim Länge&, Instanzen&, hwnd&
Dim Klassenname As String
hwnd = GetWindow(GetDesktopWindow, GW_CHILD)
Do
Klassenname = String(51, 0)
Länge = GetClassName&(hwnd, Klassenname, 50)
If Left(Klassenname, Länge) = „XLMAIN“ Then Instanzen =
Instanzen + 1
hwnd = GetWindow(hwnd, GW_HWNDNEXT)
Loop While hwnd 0
ExcelInstanzen = Instanzen
End Function
Hallo Reinhard
Danke für die Erkllärung. Ich habe schon lange „befürchtet“, dass ich noch etwas über API dazulernen muss, nun ist es so weit. Deine Antwort hilft mir zum ersten Schritt! (Ich starte wie immer und für alles mit GOOGLE!)
Erich
API Katalog
Hallo Erich,
schau mal hier:
http://www.activevb.de/rubriken/apikatalog/bylib/byl…
Gruß
Reinhard