Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1716to1720
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
23.10.2019 14:42:05
Sven
Hallo zusammen,
gibt es eine Möglichkeit, ein Userform als Objekt in der Taskleiste angezeigt zu bekommen? Ich arbeite häufig mit mehreren Excel-Mappen und -Instanzen und muss dann immer erst mal suchen, welches Excel-Objekt in der Taskleiste mich nun zum Userform bringt.

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform in Taskleiste
23.10.2019 15:07:51
Nepumuk
Hallo Sven,
in das Modul des UserForms:
Option Explicit

Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As LongPtr
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 ShowWindow Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal nCmdShow As Long) As Long

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 Sub CommandButton1_Click()
    Call Unload(Object:=Me)
End Sub

Private Sub UserForm_Activate()
    Dim lngptrHwnd As LongPtr, lngptrStyle As LongPtr
    lngptrHwnd = FindWindowA(GC_CLASSNAMEUSERFORM, Caption)
    Call ShowWindow(lngptrHwnd, SW_HIDE)
    lngptrStyle = GetWindowLongA(lngptrHwnd, GWL_EXSTYLE)
    lngptrStyle = lngptrStyle Or WS_EX_APPWINDOW
    Call SetWindowLongA(lngptrHwnd, GWL_EXSTYLE, lngptrStyle)
    Call ShowWindow(lngptrHwnd, SW_SHOW)
End Sub

Gruß
Nepumuk
Anzeige
AW: Userform in Taskleiste
23.10.2019 15:10:43
Sven
Hallo Nepumuk,
super, vielen Dank.
Klappt das bei jeder aktuellen Windows- und Excel-Version?
Was ist "ThunderDFrame" und welche Möglichkeit der Anpassung (Symbol, Bezeichnung) hat man noch?
Grüße
Sven
AW: Userform in Taskleiste
23.10.2019 15:20:13
Nepumuk
Hallo Sven,
der Text kommt aus der Caption des Userforms genauso wie das Icon. Ist kein extra Icon im Userform dann kommt automatisch das Excelicon.
So sieht es mit Icon aus:
Userbild
Woher soll das Icon kommen?
Gruß
Nepumuk
AW: Userform in Taskleiste
23.10.2019 15:54:06
Sven
Hallo Nepumuk,
ich habe schlicht nicht verstanden, wie ich das Icon definiere. Die Eigenschaft "Picture" des Userforms ist es schon mal nicht.
Aber ansonsten klappt es. Wenn man jetzt noch das leere Excel-Fenster unterdrücken könnte, hätte ich ja fast meine Standalone-Anwendung. :o)
Anzeige
AW: Userform in Taskleiste
23.10.2019 16:10:26
Nepumuk
Hallo Sven,
ich hab dir das Ganze mal in eine Beispielmappe gepackt. Das Icon welches aus dem Image entnommen wird muss zwingend von Dateityp .ico sein, sonst funktioniert es nicht.
https://www.herber.de/bbs/user/132695.xlsm
Gruß
Nepumuk
AW: Userform in Taskleiste
23.10.2019 18:17:27
Thomas
Hallo Nepumuk,
coole Sache was du da gebaut hast.
Ich bin schon lange auf der suche nach soetwas.
Kannst du da auch noch eine Maximierung mit einbauen? So das die UF "inklusive aller Steuerelemente proportional " dann auf den ganzen Bildschirm gezoomt wird? Im Netz findet man zwar ein Haufen Beispiele dazu aber irgendwie funktioniert keins davon wirklich gut. Das sich die Steuerelemente proportional mitzoomen muss ein echtes Problem sein. Ich habe in meiner Userform zwar so was eingebaut aber so richtig bin ich damit nicht zufrieden. Denn ich habe zwei Versionen dilettantisch kombiniert. Ich denke ich stell dir mal lieber nicht mein Beispiel ein. Sonst lachst du dich kaputt.
Ich frage nur weil du vielleicht so etwas auf der Platte zu liegen hast." oder ein Link den du vertraust" hast.
Ich habe nämlich schmerzlich erfahren müssen, spiele nicht mit API rum wenn man nicht weiß was da geschieht.
Aber bitte nicht neu schreiben denn ich weiß wirklich was das für arbeit macht und das was ich habe funktioniert ja irgendwie.
Cool finde ich das du da das IgnoreRemoteRequests mit eingebaut hast. Ist das richtig wie ich denke damit schottest du die Excelinstanz komplett von außen ab.
Damit habe ich auch schon experimentiert. Allerdings habe ich das dann sein gelassen. Denn auf einem Rechner ist meine UF mal abgestürzt und das IgnoreRemoteRequests blieb eingeschalten. War schon mist. Weil der Kollege nicht wusste das ich der Übeltäter war.
Könnte man so etwas irgendwie abfangen?
hab schon mal rechtvielen im voraus
mfg thomas
Anzeige
AW: Userform in Taskleiste
23.10.2019 19:15:32
Nepumuk
Hallo Sven,
wenn die Höhe und Breite Userform nicht proportional zur bildschirmhöhe / breite ist, erscheinen die Controls verschoben. Du solltest also die Grundform des Userforms möglichst proportional zu den in betrieb befindlichen Bildschirmen machen.
https://www.herber.de/bbs/user/132701.xlsm
Gruß
Nepumuk
AW: Userform in Taskleiste
23.10.2019 20:11:50
Thomas
Hallo Nepumuk,
besten dank für den Tipp. Das werde ich mal versuchen. (die Steuerelemente proportional) zu gestalten.
Dein beigefügtes Beispiel ist beim starten zu groß für mein Laptop. ( so groß das man den Button nicht mehr sieht)
Ich starte es mal morgen auf einen richtigen Monitor. Ich gebe dir dann bescheid.
Hab schon mal vielen dank das du nochmal geschaut hast.
mfg thomas
Anzeige
AW: Userform in Taskleiste
23.10.2019 20:31:17
Nepumuk
Hallo Thomas,
ich habe falsch gerechnet. Versuch es so:
sngZoom = Application.Min(100 / sngOldWidth * Width, 100 / sngOldHeight * Height)

Gruß
Nepumuk
AW: Userform in Taskleiste
23.10.2019 20:45:53
Thomas
Hallo Nepumuk,,
besten dank für deine neue Idee.
Leider ist die UF noch immer zu groß. So vom schätzen denke ich das sie ca. 1/3 zu hoch und zu weit ist.
Könnte es an meiner Auflösung liegen? Sie ist am Laptop 1920X1080.
mfg thomas
Anzeige
AW: Userform in Taskleiste
23.10.2019 20:58:23
Nepumuk
Hallo Thomas,
genau die selbe Auflösung habe ich auch. Und bei mir passt es.
Userbild
Gruß
Nepumuk
AW: Userform in Taskleiste
23.10.2019 21:33:50
Thomas
Hallo Nepumuk,
mist ich habe auch mein Rechner neu gestartet.
https://www.herber.de/bbs/user/132706.jpg
trotzdem zu groß. Dann habe ich vielleicht ein ganz anderes Problem ( Grafik )
Ich teste es Morgen auf mein Stand PC und gebe dann eine Rückmeldung.
Hab recht vielen dank das du so schnell nicht aufgibst.
https://www.herber.de/bbs/user/132706.jpg
mfg thomas
Anzeige
AW: Userform in Taskleiste
23.10.2019 21:32:10
Planlos
Hallo
die Auflösung ist irrelevent, hier kommen die im System gesetzten PPI zum tragen, d.h. der verwendete Faktor 0.75 ist nicht statisch, sondern muss berechnet werden.

Public Declare Function GetDC Lib "user32.dll" (ByVal hWnd As Long) As Long
Public Declare Function GetDesktopWindow Lib "user32.dll" () As Long
Public Declare Function GetDeviceCaps Lib "GDI32.DLL" (ByVal hdc As Long, ByVal nIndex As Long)  _
As Long
Public Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long, ByVal hdc As Long) As  _
Long
Function TwX() As Long
Dim hdc As Long
Const LOGPIXELSX = 88
hdc = GetDC(GetDesktopWindow()) 'Application.hWndAccessApp)
TwX = GetDeviceCaps(hdc, LOGPIXELSX)
ReleaseDC GetDesktopWindow(), hdc
End Function

Im Code vom Nepumuk die 0.75 durch
72 / TwX
ersetzen
Anzeige
AW: Userform in Taskleiste
24.10.2019 04:49:03
Thomas
Hallo Planlos und Nepumuk;
hab vielen dank das du dir dies auch noch mit anschaust.
ich habe dein Vorschlag noch ein wenig ändern müssen. Da Nepumuk sein Code auf 64 bit geschrieben war.
Die gösse passt jetzt perfekt. Allerdings wird jetzt die Exceltabelle nicht mehr in die Task-leiste gelegt sondern es wird nur noch die UF ausgeblendet.
Ich muss bestimmt noch irgendeine Variable als longlong oder als LongPtr deklarieren.
Der sieht jetzt so aus:
Option Explicit
Private Declare PtrSafe Function GetSystemMetrics Lib "user32.dll" ( _
ByVal nIndex As Long) As Long
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function GetWindowRect Lib "user32.dll" ( _
ByVal hWnd As LongPtr, _
ByRef lpRect As RECT) As Long
Private Declare PtrSafe Function GetDC Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare PtrSafe Function GetDesktopWindow Lib "user32.dll" () As Long
Private Declare PtrSafe Function GetDeviceCaps Lib "GDI32.DLL" (ByVal hdc As Long, ByVal nIndex As Long) _
As Long
Private Declare PtrSafe Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long, ByVal hdc As Long) As _
Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Const SM_CXSCREEN = 0&
Private Const SM_CYSCREEN = 1&
Private Const GC_CLASSNAMETASKBAR = "Shell_TrayWnd"
Private Sub CommandButton1_Click()
Call Unload(Object:=Me)
End Sub

Private Sub UserForm_Initialize()
Dim lngTaskBarHeight As Long
Dim sngZoom As Single, sngOldWidth As Single, sngOldHeight As Single
Dim lngptrHwnd As LongPtr
Dim udtRect As RECT
lngptrHwnd = FindWindowA(GC_CLASSNAMETASKBAR, vbNullString)
Call GetWindowRect(lngptrHwnd, udtRect)
lngTaskBarHeight = udtRect.Bottom - udtRect.Top
sngOldWidth = Width
sngOldHeight = Height
StartUpPosition = 0
Top = 0
Left = 0
Width = GetSystemMetrics(SM_CXSCREEN) * 72 / TwX
Height = (GetSystemMetrics(SM_CYSCREEN) - lngTaskBarHeight) * 72 / TwX
sngZoom = Application.Min(100 / sngOldWidth * Width, 100 / sngOldHeight * Height)
Zoom = Application.Min(Fix(sngZoom), 400)
End Sub

Function TwX() As Long
Dim hdc As Long
Const LOGPIXELSX = 88
hdc = GetDC(GetDesktopWindow()) 'Application.hWndAccessApp)
TwX = GetDeviceCaps(hdc, LOGPIXELSX)
ReleaseDC GetDesktopWindow(), hdc
End Function
https://www.herber.de/bbs/user/132710.xlsm
könnt ihr euch dies nochmal anschauen?
mfg thomas
Anzeige
AW: Userform in Taskleiste
24.10.2019 10:54:02
Nepumuk
Hallo Planlos,
egal was ich in Windows als Vergrößerungsfaktor einstelle gibt mir deine Funktion den Wert 96 zurück. Oder muss ich Windows neu starten?
Gruß
Nepumuk
AW: Userform in Taskleiste
24.10.2019 11:09:25
Nepumuk
Nochmal Hallo,
konnte eine Antwort nicht abwarten, ich muss also den Rechner nach der Umstellung neu starten damit der "richtige" Wert kommt.
Hier die Deklarationen ab Excel 2010 32/64 Bit:
Option Explicit

Private Declare PtrSafe Function GetDC Lib "user32.dll" ( _
    ByVal hwnd As LongPtr) As LongPtr
Private Declare PtrSafe Function GetDesktopWindow Lib "user32.dll" () As LongPtr
Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32.dll" ( _
    ByVal hdc As LongPtr, _
    ByVal nIndex As Long) As Long
Private Declare PtrSafe Function ReleaseDC Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal hdc As LongPtr) As Long

Private Const LOGPIXELSX As Long = 88

Function TwX() As Long
    Dim lngptrHdc As LongPtr
    Dim lngptrHwnd As LongPtr
    lngptrHwnd = GetDesktopWindow
    lngptrHdc = GetDC(lngptrHwnd) 'Application.hWndAccessApp)
    TwX = GetDeviceCaps(lngptrHdc, LOGPIXELSX)
    ReleaseDC lngptrHwnd, lngptrHdc
End Function

Gruß
Nepumuk
Anzeige
AW: Userform in Taskleiste
25.10.2019 11:44:35
Thomas
Hallo Nepumuk,
sorry das ich erst heute antworte.
Gestern hatte ich kein Rechner.
Hab recht vielen dank das Du dies noch eingebaut hast. ( Excel 2010 32/64 Bit )
Die Vergrößerung passt jetzt.
Ich wünsche dir noch ein schönes Wochenende
MFG Thomas

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige