Excel öffen, weitere App. minimieren...
#1
Heye Excelfreunde,

ja ja, lange ist es her, dass ich hier zugegen war.[img]
Dateiupload bitte im Forum! So geht es: Klick mich!
2/21.gif[/img] Ich wünsche Euch allen viel Gesundheit, in diesen Zeiten...

Suche eine VBA-Antwort. Eine (z.Bsp. WinExplorer) oder mehrere App. sind offen. mit dem Explorer wird eine Exceldatei.xlsm geöffnet und eine Userform
wird über "workbookopen" gestartet. Über einen Button (Abfrage Ja/Nein) kann ein Formular (Tab.blatt) geöffnet werden. Ist es möglich, vor dem Öffen des Formulars, ggf. schon beim Öffen der Exceldatei.xlsm alle anderen App's zu minimieren ohne dass die Excelanwendung zu and auf geht, oder ähnliches.
Vielen Dank
--Janosch
                                                     
Excel  2019 (64bit)  Win 10 Pro (64bit)                              
Antworten Top
#2
Hallo Janosch,

ja, es ist grundsätzlich und relativ einfach möglich, alle Anwendungen zu minimieren. Z.B. mit der API-Funktion "ShowWindow".
Hierfür benötigst Du allerdings das Handle für jedes zu minimierende  Fenster.

Bei einigen wenigen, bei denen auch der Captiontext bekannt ist, kannst Du das Handle über die API-Funktion "FindWindow" ermitteln.
Bei vielen Fenstern oder nicht bekannten Captiontexte kannst Du in einer Schleife alle vorhandene Fenster ermitteln.

Es führt jedoch zu Fehlfunktionalitäten, wenn man alle Fenster einfach minimieren wollte, deshalb ist es ratsam, die zu minimierende Fenster vorzugeben.
Entweder über den Captiontext oder über den Klassennamen.

Im folgenden Beispiel werden alle Explorer-, Word- und "Microsoft Edge"- Seiten sowie alle Seiten, die im Fenstertext "Adobe " enthalten, minimiert.

Code:

Private Declare PtrSafe Function EnumWindows Lib "user32.dll" ( _
        ByVal lpEnumFunc As LongPtr, _
        ByVal lParam As LongPtr) As Long
Private Declare PtrSafe Function GetWindowTextA Lib "user32.dll" ( _
        ByVal hwnd As LongPtr, ByVal lpString As String, _
        ByVal cch As Long) As Long
Private Declare PtrSafe Function GetWindowTextLengthA Lib "user32.dll" ( _
        ByVal hwnd As LongPtr) As Long
Private Declare PtrSafe Function GetClassNameA Lib "user32.dll" ( _
        ByVal hwnd As LongPtr, ByVal lpClassName As String, _
        ByVal nMaxCount As Long) As Long
Private Declare PtrSafe Function ShowWindow Lib "user32" ( _
        ByVal hwnd As LongPtr, _
        ByVal nCmdShow As Long) As Long

Sub MinimiereAlleFenster()
  Call EnumWindows(AddressOf WinCallBack, ByVal 0)
End Sub

Private Function WinCallBack(ByVal hwnd As LongPtr, ByVal lParam As LongPtr) As Long
  Dim sCaption As String, sClassName As String, L As Long
  
  If hwnd <> Application.hwnd Then
     sClassName = Space$(255)
     L = GetClassNameA(hwnd, sClassName, 255)
     sClassName = Left$(sClassName, L)          ' Klassenname holen
     L = GetWindowTextLengthA(hwnd)
     sCaption = Space$(L)
     Call GetWindowTextA(hwnd, sCaption, L + 1) ' Captiontext holen
     If InStr("Chrome_WidgetWin_1,CabinetWClass,OpusApp", sClassName) > 0 _
        Or sCaption Like "*Adobe *" Then
        ShowWindow hwnd, 2                      ' 2 = SW_SHOWMINIMIZED
     End If
  End If
  WinCallBack = 1
End Function

_________
viele Grüße
Karl-Heinz
[-] Folgende(r) 1 Nutzer sagt Danke an volti für diesen Beitrag:
  • radagast
Antworten Top
#3
Heje Excelfreunde, volti,

da gehst Du ja ganz schön ran. Für einen Excel-Laien , wie ich, ganz schön harte Kost. Das was ich erkenne, ist, dass dieses nur für die 64bit Versionen in Excel und Win. anwendbar ist. Bin selbst gespannt wie ich da weiter kommen kann. Die von mir entwickelte Exceltabelle muss auch unter 32bit Excel laufen....

Vielen Dank für Deine Mühen...
Vielen Dank
--Janosch
                                                     
Excel  2019 (64bit)  Win 10 Pro (64bit)                              
Antworten Top
#4
Hallo Radagast,

die gezeigten Declares sind sowohl für 32 Bit wie auch für 64 Bit geeignet, sofern Du mit einer Excelversion >10 arbeitest.
Reine 64 Bit-Funktionen, die nicht vom 32-Bit-Excel unterstützt werden, sind in diesem Code nicht enthalten.
Es gibt ohnehin nur ein paar wenige reine 64-Bit-Funktionen....

32-Bit-Excel kann beides, die alte Version ohne PtrSafe wie auch die neue Version mit PtrSafe. Das ist vielen Usern nicht klar.

Solltest Du wider Erwarten noch Uralt-Excel einsetzen wollen, kannst Du den u.a. Code dafür nehmen. Der unterstützt jetzt alles (ungetestet).

Code:

#If VBA7 Then
 Private Declare PtrSafe Function EnumWindows Lib "user32.dll" ( _
         ByVal lpEnumFunc As LongPtr, _
         ByVal lParam As LongPtr) As Long
 Private Declare PtrSafe Function GetWindowTextA Lib "user32.dll" ( _
         ByVal hwnd As LongPtr, ByVal lpString As String, _
         ByVal cch As Long) As Long
 Private Declare PtrSafe Function GetWindowTextLengthA Lib "user32.dll" ( _
         ByVal hwnd As LongPtr) As Long
 Private Declare PtrSafe Function GetClassNameA Lib "user32.dll" ( _
         ByVal hwnd As LongPtr, ByVal lpClassName As String, _
         ByVal nMaxCount As Long) As Long
 Private Declare PtrSafe Function ShowWindow Lib "user32" ( _
         ByVal hwnd As LongPtr, _
         ByVal nCmdShow As Long) As Long
#Else
 Private Declare Function EnumWindows Lib "user32.dll" ( _
         ByVal lpEnumFunc As Long, _
         ByVal lParam As Long) As Long
 Private Declare Function GetWindowTextA Lib "user32.dll" ( _
         ByVal hwnd As Long, ByVal lpString As String, _
         ByVal cch As Long) As Long
 Private Declare Function GetWindowTextLengthA Lib "user32.dll" ( _
         ByVal hwnd As Long) As Long
 Private Declare Function GetClassNameA Lib "user32.dll" ( _
         ByVal hwnd As Long, ByVal lpClassName As String, _
         ByVal nMaxCount As Long) As Long
 Private Declare Function ShowWindow Lib "user32" ( _
         ByVal hwnd As Long, _
         ByVal nCmdShow As Long) As Long
#End If

Sub MinimiereAlleFenster()
  Call EnumWindows(AddressOf WinCallBack, ByVal 0)
End Sub

#If VBA7 Then
Private Function WinCallBack(ByVal hwnd As LongPtr, ByVal lParam As LongPtr) As Long
#Else
Private Function WinCallBack(ByVal hwnd As Long, ByVal lParam As Long) As Long
#End If
  Dim sCaption As String, sClassName As String, L As Long
  
  If hwnd <> Application.hwnd Then
     sClassName = Space$(255)
     L = GetClassNameA(hwnd, sClassName, 255)
     sClassName = Left$(sClassName, L)          ' Klassenname holen
     L = GetWindowTextLengthA(hwnd)
     sCaption = Space$(L)
     Call GetWindowTextA(hwnd, sCaption, L + 1) ' Captiontext holen
     If InStr("Chrome_WidgetWin_1,CabinetWClass,OpusApp", sClassName) > 0 _
        Or sCaption Like "*Adobe *" Then
        ShowWindow hwnd, 2                      ' 2 = SW_SHOWMINIMIZED
     End If
  End If
  WinCallBack = 1
End Function

_________
viele Grüße
Karl-Heinz
[-] Folgende(r) 1 Nutzer sagt Danke an volti für diesen Beitrag:
  • radagast
Antworten Top
#5
Heje Excelfreund, volti,

ersteinmal nochmals vielen Dank für Deine Mühen...

habe zu Verständnis noch eine Frage. In der excel.fkt. InStr() befindet sich der Konstrukt "Chrome_WidgetWin_1,CabinetWClass,OpusApp", entspricht das dem "sCaption", bzw. auch dem zu untersuchenden String in der Funktion. Ggf. kurz ein paar Worte zu meinem Verständnis, Danke.

     If InStr("Chrome_WidgetWin_1,CabinetWClass,OpusApp", sClassName) > 0 _
        Or sCaption Like "*Adobe *" Then
        ShowWindow hwnd, 2                      ' 2 = SW_SHOWMINIMIZED
     End If
Vielen Dank
--Janosch
                                                     
Excel  2019 (64bit)  Win 10 Pro (64bit)                              
Antworten Top
#6
Hallo Janosch,

da werden drei Klassennamen abgefragt. Es können auch mehr sein.....

Chrome_WidgetWin_1 = Klasse für den Edge
CabinetWClass            = Klasse für den Explorer
OpusApp                    = Klasse für mein Word
Notepad                     = Klasse für Editor
Excel7                        = Klasse für mein Excel
AcrobatSDIWindow      = Klasse für PDF-Reader
MozillaWindowClass      = Klasse für Firefox
usw.

Das sind also keine Begriffe, die im Caption stehen. Wenn man den Klassennamen abfragt, werden alle Anwendungen dieser Klasse genommen, unabhängig davon, was im Caption steht.
Zugegebenerweise muss man die kennen oder so wie ich, (m)einen Window-Spy zu Hilfe nehmen.

Das Beispiel "*Adobe*" hingegen fragt gezielt den Text im Caption ab...

Gruß
Karl-Heinz
Antworten Top
#7
Heje excelfreunde, volti,



damit ich das richtig verstehe, der obige Konstrukt bezieht sich spez. auf Deine Konfiguration. Bei Kenntnis der Klassennamen würde eventuell auch folgendes funktionieren:



Dim strKlassenName as string

strKlassenName = clsName01, clsName02,clsName03,....,clsName(n)

instr(1, strKlassenName, sClassName, Compare-Anweisung) or....



Im Abschnitt mit der "Oder"-Abfrage kann ich dann mir bekannte App.exe noch abfragen.
Vielen Dank
--Janosch
                                                     
Excel  2019 (64bit)  Win 10 Pro (64bit)                              
Antworten Top
#8
Hallo,

ja das würde funktionieren (wenn man das noch in Gänsefüßchen setzt).

Wenn Dir das zu kompliziert ist, kannst Du es ja auch anders machen.....

Code:
If sClassName Like "Chrome_WidgetWin_1" Then bChck = True
If sClassName Like "CabinetWClass" Then bChck = True
If sClassName Like "OpusApp" Then bChck = True
If sCaption Like "*Adobe *" Or sCaption Like "Mein Captiontext" Then bChck = True
' usw.
If bChck Then
   ShowWindow hWnd, 2     ' 2 = SW_SHOWMINIMIZED  nd If
End If

Gruß
Karl-Heinz
Antworten Top
#9
Heje Excelfreunde, volti

mit den Anführungszeichen hast Du recht, sollte auch nur den gedanklichen Weg darstellen.
Wenn ich den obigen Ansatz mit den If-Anweisungen nehme, dann würde ich noch die fehlende bChck boolsche Variable mit "dim" und die
if-Anweisunng "If bChck = true then...." ergänzen. Dieser Ansatz ist etwas schreibaufwendiger, mir aber sympatischer.

Wo gibst Du Untericht über Programmiertechniken...

Vielen Dank für Deine Hilfe
Vielen Dank
--Janosch
                                                     
Excel  2019 (64bit)  Win 10 Pro (64bit)                              
Antworten Top
#10
Hallo Janosch,

alles klar und viel Erfolg noch.

PS: Ich bin Privatprogger und gebe keinen Unterricht.  19

Gruß KH
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste