Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1896to1900
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Userform in Taskleiste

Userform in Taskleiste
15.09.2022 05:26:58
Thomas
Hallo, ich rufe in Excel beim Starten ein Userform auf und blende dann Excel aus, so das nur das Userform sichtbar ist, allerdings ist die Userform dann auch nicht in der Taskleiste sichtbar, so das wenn z.b. noch andere Programm aktiv sind, ggf. die Userform gar nicht zu sehen ist, bzw. ich alle anderen Programme minimieren muss um dann wieder zur Userform zu kommen.Ich hätte gerne ein Icon in der Taskleiste das das Userform darstellt und wenn ich darauf klicke das das Userform dann in den Vordergrund geholt wird,
Ich hab beim googlen das hier gefunden, https://www.herber.de/forum/archiv/1716to1720/1719270_Userform_in_Taskleiste.html nur leider funktioniert das bei mir nicht, da wird kein Icon in der Taskleiste angezeigt.
Wie könnte ich das einbauen, nutze sowohl 32 wie auch 64 Bit Office?
Und wenn wir schon dabei sind, ist es auch möglich das man das Userform minimieren kann, also wie man es aus anderen Windows Anwendungen kennt?
Danke

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform in Taskleiste
15.09.2022 10:16:46
Nepumuk
Hallo Thomas,
versuch es damit:

Option Explicit
#If Win64 Then
Private Declare PtrSafe Function GetWindowLongPtr Lib "user32.dll" Alias "GetWindowLongPtrA" ( _
ByVal Hwnd As LongPtr, _
ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongPtr Lib "user32.dll" Alias "SetWindowLongPtrA" ( _
ByVal Hwnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) As LongPtr
#Else
Private Declare PtrSafe Function GetWindowLongPtr Lib "user32.dll" Alias "GetWindowLongA" ( _
ByVal Hwnd As LongPtr, _
ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongPtr Lib "user32.dll" Alias "SetWindowLongA" ( _
ByVal Hwnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) As LongPtr
#End If
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function ShowWindow Lib "user32.dll" ( _
ByVal Hwnd As LongPtr, _
ByVal nCmdShow As Long) As Long
Private Declare PtrSafe Function SendMessageA Lib "user32.dll" ( _
ByVal Hwnd As LongPtr, _
ByVal wMsg As Long, _
ByVal wParam As LongPtr, _
ByVal lParam As Any) As LongPtr
Private Const WM_SETICON As Long = &H80
Private Const GC_CLASSNAMEUSERFORM As String = "ThunderDFrame"
Private Const GWL_EXSTYLE As Long = -20
Private Const WS_EX_APPWINDOW As LongPtr = &H40000
Private Const SW_HIDE As Long = 0
Private Const SW_SHOW As Long = 5
Private mlngptrHwnd As LongPtr
Private Sub CommandButton1_Click()
Call Unload(Object:=Me)
End Sub
Private Sub UserForm_Activate()
Dim lngptrStyle As LongPtr
Call ShowWindow(Hwnd, SW_HIDE)
lngptrStyle = GetWindowLongPtr(Hwnd, GWL_EXSTYLE)
lngptrStyle = lngptrStyle Or WS_EX_APPWINDOW
Call SetWindowLongPtr(Hwnd, GWL_EXSTYLE, lngptrStyle)
Call ShowWindow(Hwnd, SW_SHOW)
End Sub
Private Sub UserForm_Initialize()
Hwnd = FindWindowA(GC_CLASSNAMEUSERFORM, Caption)
'Icon in Titlebar
Call SendMessageA(Hwnd, WM_SETICON, 0&, Image1.Picture.Handle)
End Sub
Private Property Get Hwnd() As LongPtr
Hwnd = mlngptrHwnd
End Property
Private Property Let Hwnd(ByVal pvlngptrHwnd As LongPtr)
mlngptrHwnd = pvlngptrHwnd
End Property
Private Sub UserForm_Terminate()
Application.Visible = True
End Sub
Meine Testmappe: https://www.herber.de/bbs/user/155185.xlsm
Gruß
Nepumuk
Anzeige
AW: Userform in Taskleiste
16.09.2022 05:13:20
Thomas
Hallo Nepumuk,
schonmal vielen Dank für deinen Code und die Beispielmappe, wenn ich die Beispielmappe starte und dann die Button drücke, wird mir das Userform angezeigt, aber in der Taskleiste ist nur das Excel Icon, ich hätte da jetzt das Icon des Userforms erwartet oder verstehe ich es falsch, bzw. geht das nur mit dem Excel Icon in der Taskleiste`?
Userbild
AW: Userform in Taskleiste
16.09.2022 09:00:40
Nepumuk
Hallo Thomas,
ändere die Aufrufprozedur im Modul1 so:

Option Explicit
Public Sub start()
Call UserForm1.Show
End Sub
Und die Activate-Prozedur des UserForms so:

Private Sub UserForm_Activate()
Dim lngptrStyle As LongPtr
Call ShowWindow(Hwnd, SW_HIDE)
lngptrStyle = GetWindowLongPtr(Hwnd, GWL_EXSTYLE)
lngptrStyle = lngptrStyle Or WS_EX_APPWINDOW
Call SetWindowLongPtr(Hwnd, GWL_EXSTYLE, lngptrStyle)
Call ShowWindow(Hwnd, SW_SHOW)
Application.Visible = False
End Sub
Dann klappt es auch mit dem Icon in der Taskleiste.
Gruß
Nepumuk
Anzeige
AW: Userform in Taskleiste
20.09.2022 04:54:41
Thomas
Hallo Nepumuk,
leider auch nicht, bekomme weiterhin "nur" das Excel Logo angezeigt
Userbild
AW: Userform in Taskleiste
16.09.2022 05:41:59
Thomas
Hallo nochmal, zu deinem Code hätte ich dann noch ein paar Fragen, das ich ihn auch richtig verstehe.

Private Sub CommandButton1_Click()
Call Unload(Object:=Me)
End Sub
Das ist der Button auf dem UserForm , da ich rausnehmen kann ich das Userform über einen "Beenden "Button schon schließe.
Den Initialize teil kopiere ich in meine initialize rotine mit rein.

Private Sub UserForm_Initialize()
Dim arrTab As Variant  'Array Variable um die Daten der Spalte B im Worksheet "Stammdaten" zu erfassen und diese nachher der Combobox zur Auswahl zu übergeben
'Icon in Titlebar
Hwnd = FindWindowA(GC_CLASSNAMEUSERFORM, Caption)
Call SendMessageA(Hwnd, WM_SETICON, 0&, Image1.Picture.Handle)
'Initialisierung der Public Variablen
Pfad = "K:\UserForm\"
Datei = ""
Ort= ""
Bild= ""
Was genau passiert hier?

Private Sub UserForm_Activate()
Dim lngptrStyle As LongPtr
Call ShowWindow(Hwnd, SW_HIDE)
lngptrStyle = GetWindowLongPtr(Hwnd, GWL_EXSTYLE)
lngptrStyle = lngptrStyle Or WS_EX_APPWINDOW
Call SetWindowLongPtr(Hwnd, GWL_EXSTYLE, lngptrStyle)
Call ShowWindow(Hwnd, SW_SHOW)
End Sub
Private Property Get Hwnd() As LongPtr
Hwnd = mlngptrHwnd
End Property
Private Property Let Hwnd(ByVal pvlngptrHwnd As LongPtr)
mlngptrHwnd = pvlngptrHwnd
End Property
Private Sub UserForm_Terminate()
Application.Visible = True
End Sub
Wo wird das aufgerufen?

Private Sub UserForm_Terminate()
Application.Visible = True
End Sub
Es scheint so zu funktionieren wie ich es mir grundsätzlich vorgestellt habe nur das es noch schöner wäre wenn anstatt des Excel Icons das Icon des USerform in der Taskleiste angezeigt würde.
Danke
Anzeige
AW: Userform in Taskleiste
15.09.2022 10:18:58
volti
Hallo Thomas,
das Minimieren der Userform sollte mit u.a. Code funktionieren. Probiere es mal aus.
PS: Das Icon erscheint bei dem angegebenen Code (link) bei mir unter 365 auch nicht mehr. Es wird ja auch immer nur ein Excel-Icon angezeigt, nicht wie früher, wenn mehrere Excel offen waren auch mehrere Icons da waren.
Leider habe ich da jetzt keine Zeit für. Vielleicht hat jemand anderes gerade was parat.
Code:


Private Declare PtrSafe Function ShowWindow Lib "user32.dll" ( _ ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long Private Const SW_SHOWNORMAL = 1 Private Const SW_SHOWMAXIMIZED = 3 Private Const SW_SHOWMINIMIZED = 2 Private Sub CommandButton1_Click() ShowWindow FindWindowA("ThunderDFrame", Caption), SW_SHOWMINIMIZED End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Userform in Taskleiste
16.09.2022 05:52:21
Thomas
Hallo Karl-Heinz,
vielen Dank dafür, das klappt über den Button auch wie es soll, außer das von dir schon erwähnte "Problem" mit dem Icon, das dürfte ja dann auch bei meinem anderen anliegen wo Nepumuk geholfen hat das problem sein. Das Mnimieren funktioniert hier ja jetzt über einen Burron, geht das nicht wie in anderebn Programmen über einen Unterstrich rechts oben im Fenster?
Kannst du mir vielleicht noch kurz deinen Code etwas erklären, diese Funktionen/Befehle übersteigen leider "noch" meinen VBA Horizont.
Danke
MFG
Thomas
AW: Userform in Taskleiste
16.09.2022 08:40:41
volti
Hallo Thomas,
dann teste mal folgenden Code.
Zur Erklärung:
Über FindWindow holen wir uns anhand des Caption (Text in blauem Kopf) das Handle der Userform
Dann ändern wir den Fensterstyle und fügen Minibox/Maxibox hinzu
Code:


Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _ ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr #If Win64 Then Private Declare PtrSafe Function GetWindowLongA Lib "user32.dll" _ Alias "GetWindowLongPtrA" ( _ ByVal Hwnd As LongPtr, ByVal nIndex As Long) As LongPtr Private Declare PtrSafe Function SetWindowLongA Lib "user32.dll" _ Alias "SetWindowLongPtrA" ( _ ByVal Hwnd As LongPtr, ByVal nIndex As Long, _ ByVal dwNewLong As LongPtr) As LongPtr #Else Private Declare PtrSafe Function GetWindowLongA Lib "user32.dll" ( _ ByVal Hwnd As LongPtr, ByVal nIndex As Long) As LongPtr Private Declare PtrSafe Function SetWindowLongA Lib "user32.dll" ( _ ByVal Hwnd As LongPtr, ByVal nIndex As Long, _ ByVal dwNewLong As LongPtr) As LongPtr #End If Private Const GWL_STYLE = -16& Private Const WS_MINIMIZEBOX = &H20000 Private Const WS_MAXIMIZEBOX = &H10000 Private Sub UserForm_Initialize() Dim Hwnd As LongPtr Hwnd = FindWindowA("ThunderDFrame", Caption) SetWindowLongA Hwnd, GWL_STYLE, GetWindowLongA(Hwnd, GWL_STYLE) _ Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Userform in Taskleiste
20.09.2022 05:12:55
Thomas
Hallo Karl-Heinz, das klappt wunderbar, scheint sich aber irgendwo mit dem Code von Nepumuk zu "beißen" da dann beim minimieren werde das Icon des Userform noch von Excel in der Taskleiste angezeigt wird, sieht also so aus als ob es einfach "weg" wäre und ich bekomme es nur über Alt+Umschalt wieder in den Vordergrund
AW: Userform in Taskleiste
20.09.2022 05:32:49
Thomas
Hallo nochmal, @Nepumuk und @Karl-Heinz, ich habe mich mal dran versucht eure beiden Codes zusammenzuführen in meinem kleinen Tool, das ganze sieht jetzt so aus.

Option Explicit
'UserForm in Taskleisten und Minimieren im Rahmen
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#If Win64 Then
Private Declare PtrSafe Function GetWindowLongA Lib "user32.dll" Alias "GetWindowLongPtrA" ( _
ByVal Hwnd As LongPtr, _
ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongA Lib "user32.dll" Alias "SetWindowLongPtrA" ( _
ByVal Hwnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) As LongPtr
#Else
Private Declare PtrSafe Function GetWindowLongA Lib "user32.dll" ( _
ByVal Hwnd As LongPtr, _
ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function SetWindowLongA Lib "user32.dll" ( _
ByVal Hwnd As LongPtr, _
ByVal nIndex As Long, _
ByVal dwNewLong As LongPtr) As LongPtr
#End If
Private Declare PtrSafe Function ShowWindow Lib "user32.dll" ( _
ByVal Hwnd As LongPtr, _
ByVal nCmdShow As Long) As Long
Private Declare PtrSafe Function SendMessageA Lib "user32.dll" ( _
ByVal Hwnd As LongPtr, _
ByVal wMsg As Long, _
ByVal wParam As LongPtr, _
ByVal lParam As Any) As LongPtr
Private Const WM_SETICON As Long = &H80
Private Const GC_CLASSNAMEUSERFORM As String = "ThunderDFrame"
Private Const GWL_EXSTYLE As Long = -20
Private Const WS_EX_APPWINDOW As LongPtr = &H40000
Private Const SW_HIDE As Long = 0
Private Const SW_SHOW As Long = 5
Private mlngptrHwnd As LongPtr
'Userform Minimieren
Private Const GWL_STYLE = -16&
Private Const WS_MINIMIZEBOX = &H20000
Private Const WS_MAXIMIZEBOX = &H10000
Private Sub UserForm_Activate()
Dim lngptrStyle As LongPtr
Call ShowWindow(Hwnd, SW_HIDE)
lngptrStyle = GetWindowLongA(Hwnd, GWL_EXSTYLE)
lngptrStyle = lngptrStyle Or WS_EX_APPWINDOW
Call SetWindowLongA(Hwnd, GWL_EXSTYLE, lngptrStyle)
Call ShowWindow(Hwnd, SW_SHOW)
End Sub
Private Property Get Hwnd() As LongPtr
Hwnd = mlngptrHwnd
End Property
Private Property Let Hwnd(ByVal pvlngptrHwnd As LongPtr)
mlngptrHwnd = pvlngptrHwnd
End Property
Private Sub UserForm_Initialize()
'Minimieren funktion im Userform
Dim Hwnd As LongPtr
Hwnd = FindWindowA("ThunderDFrame", Caption)
SetWindowLongA Hwnd, GWL_STYLE, GetWindowLongA(Hwnd, GWL_STYLE) _
Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX
'Icon in Titlebar
Hwnd = FindWindowA(GC_CLASSNAMEUSERFORM, Caption)
Call SendMessageA(Hwnd, WM_SETICON, 0&, Image1.Picture.Handle)
End Sub
Wie oben geschrieben funktioniert damit das minimieren über den Fensterrand rechts oben, allerdings wird in der Taskleiste weder das Excel Logo noch das Userform Icon angezeigt, also hab ich wohl irgendwo einen Fehler drin.
Und noch eine allgemeine Frage, wo lernt man sowas, wie den Code den hier hier gepostet habt? Ich hab jetzt 3 Bücher zu VBA durch, aber da stand von sowas nie was drin...
Danke
Anzeige
AW: Userform in Taskleiste
20.09.2022 08:07:11
volti
Hallo Thomas,
zu Deiner zweiten Frage:
Die Funktionen, die Nepumuk und ich hier gepostet haben sind genau genommen ja auch gar kein VBA, sondern Funktionen des Betriebssystems Windows.
Da gibt es weit mehrere hundert oder noch mehr von. In den VBA Lehrbüchern wird wahrscheinlich gar nicht drauf eingegangen oder nur ein, zwei Beispiele gezeigt.
Diese Funktionen kann man aber von VBA und den meisten anderen Programmiersprachen aufrufen. Es gibt auch dicke Bücher dazu.......
Tipp: In der Sub UserForm_Initialize reicht es, das Handle nur einmal zu holen also nur einmal Hwnd = FindWindowA("ThunderDFrame", Caption)
Gruß Karl-Heinz
Anzeige
AW: Userform in Taskleiste
20.09.2022 11:18:50
volti
Hallo Thomas,
hier noch ein alternativer Code, der das Icon nicht über SendMessage sondern über SetClassLong setzt. Gleichzeitig habe ich noch eine Function eingebaut, die die Userform immer im Vordergrund hält, auch wenn Du andere Anwendungen aktivierst.
Falls nicht gewünscht, SetWindowPos ausremmen oder entfernen.
Leider ist es auch hier so, dass das Icon in der Taskleiste nicht sofort sichtbar ist. In der Taskleiste ist die Userform mit dem Icon sichtbar wenn man über das Excel-Icon fährt, das Excel-Icon selbst wird nicht ersetzt. Das könnte m.E. daran liegen, dass die einzelnen Excelblätter und auch die Userform Childwindows (also untergeordnete Fenster von Excel) sind.
Mein Versuch, (wie früher mal bei einem Spiel) das App-Icon ebenfalls zu ändern, hat zwar geklappt, unter meiner derzeitigen Version wird es aber nicht mehr im Caption von Excel und auch nicht in der Taskleiste angezeigt.
Code:


Option Explicit ' UserForm in Taskleisten und Minimieren im Rahmen Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _ ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr #If Win64 Then Private Declare PtrSafe Function GetWindowLongA Lib "user32.dll" _ Alias "GetWindowLongPtrA" ( _ ByVal Hwnd As LongPtr, ByVal nIndex As Long) As LongPtr Private Declare PtrSafe Function SetWindowLongA Lib "user32.dll" _ Alias "SetWindowLongPtrA" ( _ ByVal Hwnd As LongPtr, ByVal nIndex As Long, _ ByVal dwNewLong As LongPtr) As LongPtr Private Declare PtrSafe Function SetClassLongA Lib "user32" _ Alias "SetClassLongPtrA" ( _ ByVal Hwnd As LongPtr, ByVal nIndex As Long, _ ByVal dwNewLong As LongPtr) As LongPtr #Else Private Declare PtrSafe Function GetWindowLongA Lib "user32.dll" ( _ ByVal Hwnd As LongPtr, ByVal nIndex As Long) As LongPtr Private Declare PtrSafe Function SetWindowLongA Lib "user32.dll" ( _ ByVal Hwnd As LongPtr, ByVal nIndex As Long, _ ByVal dwNewLong As LongPtr) As LongPtr Private Declare PtrSafe Function SetClassLongA Lib "user32" ( _ ByVal Hwnd As LongPtr, ByVal nIndex As Long, _ ByVal dwNewLong As LongPtr) As LongPtr #End If Private Declare PtrSafe Function SetWindowPos Lib "user32" ( _ ByVal Hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _ ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, _ ByVal wFlags As Long) As Long Private Sub UserForm_Initialize() Dim Hwnd As LongPtr Const GCL_HICON = (-14) Const GWL_STYLE = -16& Const WS_MINIMAXIMIZEBOX = &H30000 Const HWND_TOPMOST = -1 ' Mini/Maximieren-Funktion im Userform Hwnd = FindWindowA("ThunderDFrame", Caption) ' Handle Userform holen SetWindowLongA Hwnd, GWL_STYLE, GetWindowLongA(Hwnd, GWL_STYLE) _ Or WS_MINIMAXIMIZEBOX ' Mini/Maxiboxen zufügen 'Icon in Titlebar SetClassLongA Hwnd, GCL_HICON, Image1.Picture.Handle ' Icon setzen SetWindowPos Hwnd, HWND_TOPMOST, 0, 0, 0, 0, &H3 ' Immer im Vordergrund Application.Visible = False ' Excel anzeigen aus End Sub Private Sub CommandButton1_Click() Call Unload(Object:=Me) Application.Visible = True End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Ich fürchte daher, dass Dein Wunsch nicht umsetzbar ist.
Anzeige
AW: Userform in Taskleiste
22.09.2022 05:38:29
Thomas
Hallo Karl-Heinz, wo meinst du das das Handle einmal reicht? Das

Hwnd = FindWindowA("ThunderDFrame", Caption)
ist doch in dem Initial so nur einmal drin oder was übersehe ich da?
Diese Funktionen kann man aber von VBA und den meisten anderen Programmiersprachen aufrufen. Es gibt auch dicke Bücher dazu....... Kannst du dazu etwas empfehlen? Danke

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige