Effekt wie Windows Explorer - Titelleiste leeren

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von WoAlK.

    Effekt wie Windows Explorer - Titelleiste leeren

    Hallo,

    gibt es eine Möglichkeit, den Inhalt der Titelleiste zu leeren (außer Schließen/Minimieren/Maximieren), aber in der Taskleiste dennoch eine Beschriftung anzuzeigen?

    Das macht ja auch z.B. der Windows Explorer (siehe Anhang) oder verschiedene "Aero-Wizards" (siehe Anhang).

    Ich habe bereits diesen Artikel im MSDN gefunden:
    blogs.msdn.com/b/wpfsdk/archiv…window-chrome-in-wpf.aspx

    Der Code in C# wäre nicht das Problem, aber irgendwie komme ich damit trotzdem nicht klar.
    ?(
    Was ist mit den "NativeMethods" gemeint?
    Und was sind diese ganzen Konstanten (die großgeschriebenen)?

    Ich würde mich freuen, wenn jemand weiß, wie man das in VB hinbekommt!


    PS.: Ja, mein Programm ist ein WPF-Programm ;) !
    Bilder
    • aerowizard_link_taskmanager.png

      69,54 kB, 824×157, 183 mal angesehen
    • explorer_taskbar.png

      104,28 kB, 511×188, 184 mal angesehen
    Um dies zu realisieren werden deiner Beschreibung nach WinAPI Aufrufe verwendet. Da diese in dlls sind welche keine .net dlls sind sondern "native"-dlls sind nennt man diese Methoden in dem Blog auch NativeMethods. Die Konstanten kommen daher, dass es in C noch nicht diese ganzen wunderbaren Enumerationen gibt. Da diese dlls jedoch auf C basieren werden eben Konstanten verwendet um anzugeben wie etwas zu geschehen hat.
    Als Beispiel gibt es die WinAPI Funktion ShowWindow(HWND, eine zahl). Die Zahl sagt hier aus ob das Fenster anzeigt/versteckt,... werden soll. Damit sich der Programmierer nicht die ganzen Zahlen merken muss wurden in den Headerdateien Konstanten wie SW_HIDE, SW_SHOW... angelegt. Wenn man nun diese Funktionen in C#/VB.NET verwendet erstellen manche noch immer identische Konstanten und verzichten weiterhin auf Enumerationen. Daher kommen die ganzen Konstanten. Damit du die aufrufe verstehst was sie machen und eine anständige Beschreibung bekommst solltest du mal auf msdn nach den Funktionen suchen und dort nachlesen. Dort sind auch die ganzen Konstanten aufgelistet.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    Die Lösung des Problems!

    Nach "langer Zeit" habe ich nun doch eine Lösung gefunden (falls es noch jemanden interessiert):

    VB.NET-Quellcode

    1. Imports System.Windows.Interop
    2. Imports System.Runtime.InteropServices
    3. Public Class Glass
    4. <DllImport("dwmapi.dll", PreserveSig:=False)>
    5. Public Shared Function DwmIsCompositionEnabled() As Boolean
    6. End Function
    7. <DllImport("uxtheme.dll", PreserveSig:=False)> _
    8. Public Shared Sub SetWindowThemeAttribute(<[In]()> hwnd As IntPtr, <[In]()> eAttribute As WINDOWTHEMEATTRIBUTETYPE, <[In]()> ByRef pvAttribute As WTA_OPTIONS, <[In]()> cbAttribute As UInteger)
    9. End Sub
    10. Public Shared Sub WindowThemeAttribute(window As Window, showCaption As Boolean, showIcon As Boolean)
    11. Dim isGlassEnabled As Boolean = DwmIsCompositionEnabled()
    12. Dim hwnd As IntPtr = New WindowInteropHelper(window).Handle
    13. Dim options = New WTA_OPTIONS() With {.dwMask = WTNCA.NODRAWCAPTION Or WTNCA.NODRAWICON}
    14. If isGlassEnabled Then
    15. If Not showCaption Then
    16. options.dwFlags += WTNCA.NODRAWCAPTION
    17. End If
    18. If Not showIcon Then
    19. options.dwFlags += WTNCA.NODRAWICON
    20. End If
    21. End If
    22. Dim size As UInteger = Marshal.SizeOf(options)
    23. SetWindowThemeAttribute(hwnd, WINDOWTHEMEATTRIBUTETYPE.WTA_NONCLIENT, options, size)
    24. End Sub
    25. End Class
    26. Public Class WTNCA
    27. Public Const NODRAWCAPTION As Integer = &H1
    28. Public Const NODRAWICON As Integer = &H2
    29. Public Const NOSYSMENU As Integer = &H4
    30. Public Const NOMIRRORHELP As Integer = &H8
    31. Public Const VALIDBITS As Integer = &H11
    32. End Class
    33. Public Structure WTA_OPTIONS
    34. Public dwFlags As UInteger
    35. Public dwMask As UInteger
    36. End Structure
    37. Public Enum WINDOWTHEMEATTRIBUTETYPE
    38. WTA_NONCLIENT = 1
    39. End Enum


    Es funktioniert perfekt, wenn man es folgendermaßen aufruft:

    VB.NET-Quellcode

    1. Public Class MainWindow
    2. Protected Overrides Sub OnSourceInitialized(e As System.EventArgs)
    3. Glass.WindowThemeAttribute(Me, False, False)
    4. End Sub
    5. ' ...