Cover in Programmvorschau in Taskleise als Bild anzeigen

  • VB.NET

Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von Linux13524.

    Also. Ich habe es jetzt so:

    VB.NET-Quellcode

    1. Private Sub frmTest_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim x As New IntPtr(1)
    3. Dim y As New IntPtr(1)
    4. DwmSetWindowAttribute(Me.Handle, 7, x, Marshal.SizeOf(x))
    5. DwmSetWindowAttribute(Me.Handle, 10, y, Marshal.SizeOf(y))
    6. End Sub
    7. Protected Overrides Sub WndProc(ByRef m As Message)
    8. Const WM_DWMSENDICONICTHUMBNAIL = &H323
    9. If m.Msg = WM_DWMSENDICONICTHUMBNAIL Then
    10. Using bmp As Bitmap = Bitmap.FromFile("C:\test.jpg")
    11. Dim int As Integer = DwmSetIconicThumbnail(Me.Handle, bmp.GetHbitmap, &H1)
    12. End Using
    13. Else
    14. MyBase.WndProc(m)
    15. End If
    16. End Sub


    Wenn ich jetzt das Vorschaubild ansehen will wird dort eine Warteanimation angezeigt, aber leider nicht das Bild.

    @Artentus
    Was meintest du mit
    Und du darfst nicht vergessen die HBitmap auch zu zerstören.
    Dispose?
    Mit freundlichen Grüßen

    Linux
    Also:
    Signatur:

    VB.NET-Quellcode

    1. <DllImport("gdi32.dll")> _
    2. Private Shared Function DeleteObject(hObject As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    3. End Function

    Code:

    VB.NET-Quellcode

    1. Using bmp As Bitmap = Bitmap.FromFile("C:\test.jpg")
    2. Dim hbmp As IntPtr = bmp.GetHbitmap
    3. Dim int As Integer = DwmSetIconicThumbnail(Me.Handle, hbmp, &H1)
    4. DeleteObject(hbmp)
    5. End Using

    So in etwa?

    Funktioniert trotzdem nicht.
    Mit freundlichen Grüßen

    Linux
    Überschreitet das Bild möglicherweise die erlaubten Abmessungen?

    MSDN schrieb:

    The HIWORD of this value is the maximum x-coordinate of the thumbnail. The LOWORD is the maximum y-coordinate. If a thumbnail has a dimension that exceeds one or both of these values, the DWM does not accept the thumbnail.
    Es könnte auch hieran liegen:

    Linux13524 schrieb:

    Marshal.SizeOf(x)

    Hier übergibst du die Größe des Pointers, die Funktion will aber die Größe des Werte, auf den der Pointer zeigt.

    Außerdem erstellst du mit New IntPtr(1) keinen Pointer, der auf 1 zeigt, sondern einen Pointer, der auf Adresse 1 zeigt. Du solltest den Speicher mit Marshal.AllocCoTaskMem oder Marshal.AllocHGlobal reservieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

    Ich gebe zu ich habe hier bei weitem nicht alles gelesen und habe auch nicht wirklich viel plan von GDI+. Aber wisst ihr was genau GetHbitmap macht? Wenn nicht wäre vll. mal eine option das using wegzulassen und erst später manuell zu zerstören. Denn wenn das HBitmap teil auf den Speicher deiner Bitmap verweist und du diesen schon freigegeben hast wird verständlicherweise nichts dargestellt. Wie gesagt ich weiß nicht ob da intern der Speicher kopiert wird oder ob der geteilt wird.
    Als weiters wäre es vll. mal gut die Remarks durchzulesen. Siehe da: msdn.microsoft.com/en-us/libra…op/dd389411(v=vs.85).aspx Wie gesagt. Weiß aber nicht ob ihr das nicht schon alles längst getan habt. Aber wie wäre es mal WndProc zu überschreiben auf die Message zu warten und dann zu schauen was du da für Koordinaten bekommst. Bist du dir sicher, dass die Bitmap 32bit ist? Irgendwo steht garantiert die Lösung. Einfach mal alles auf msdn durchlesen :) Nur so als kleine Anmerkung.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @Gonger96
    Du kannst natürlich auch Pointer nach außerhalb verwalten, aber die meisten Windows-Funktionen interpretieren das relativ zum aufrufenden Prozess. Bei ReadProcessMemory kanns du das schön sehen, du musst nur den offset innerhalb des Prozessspeichers angeben, den Rest rechnet Windows dann dazu.
    Wenn ich mich nicht ganz irre, dann bezeichnet man das als Paging.
    @Artentus
    Ich habs mal getestet du hast Recht. Dann machn wirs so

    VB.NET-Quellcode

    1. Dim BOOL As Int32 = 1
    2. Dim gcBo As GCHandle = GCHandle.Alloc(BOOL, GCHandleType.Pinned)
    3. DwmSetWindowAttribute(Me.Handle, 7, gcBo.AddrOfPinnedObject(), Marshal.SizeOf(BOOL))
    4. gcBo.Free()

    Mit der Andren natürlich auch noch.

    //
    @Linux13524
    Wenn du den Wait-Cursor auf deiner Form meinst, dass ist normal weils so nicht behandelt wird. Um die Preview auf der Form zu setzen guck dir DwmSetIconicLivePreviewBitmap an. Funzt genauso wie das erste

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gonger96“ ()

    Ok. Jetzt funktioniert es. Es lag an der Größe. Man kann maximal 100x100 nehmen.
    Ich danke euch allen! :)

    //Edit
    @Gonger96
    Was is denn der unterschied zwischen DwmSetIconicLivePreviewBitmap und DwmSetIconicThumbnail?
    Mit freundlichen Grüßen

    Linux
    SetIconicLivePreviewBitmap setzt dir die Previewbitmap auf dir Form. Heißt wenn du in der Taskbar über son Ding hovers, die Preview aufpoppt und du mitm Cursor darüber hoverst, dann wird alles minimiert und dein Fenster gezeigt. Diese Preview wird abgeändert. Beim Anderen wird die Preview in der Taskbar geändert