Registriert seit: 15.04.2014
Version(en): 2007, 2010, 2019
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)
Registriert seit: 22.11.2019
Version(en): 365
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:1 Nutzer sagt Danke an volti für diesen Beitrag 28
• radagast
Registriert seit: 15.04.2014
Version(en): 2007, 2010, 2019
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)
Registriert seit: 22.11.2019
Version(en): 365
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:1 Nutzer sagt Danke an volti für diesen Beitrag 28
• radagast
Registriert seit: 15.04.2014
Version(en): 2007, 2010, 2019
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)
Registriert seit: 22.11.2019
Version(en): 365
24.05.2022, 23:01
(Dieser Beitrag wurde zuletzt bearbeitet: 24.05.2022, 23:04 von volti.)
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
Registriert seit: 15.04.2014
Version(en): 2007, 2010, 2019
25.05.2022, 07:05
(Dieser Beitrag wurde zuletzt bearbeitet: 25.05.2022, 07:07 von radagast.)
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)
Registriert seit: 22.11.2019
Version(en): 365
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
Registriert seit: 15.04.2014
Version(en): 2007, 2010, 2019
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)
Registriert seit: 22.11.2019
Version(en): 365
Hallo Janosch, alles klar und viel Erfolg noch. PS: Ich bin Privatprogger und gebe keinen Unterricht. Gruß KH
|