Desktop Widget Form wird nach der Funktion "Desktop anzeigen" auf dem Desktop nicht mehr angezeigt.

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von DominikZettl.

    Desktop Widget Form wird nach der Funktion "Desktop anzeigen" auf dem Desktop nicht mehr angezeigt.

    Hallo,
    Ich arbeite derzeit an einem kleinen Desktop Widget, welches bisher auch gut funktioniert.
    Vor kurzem ist mir jedoch ein Problem aufgefallen, wenn ich z.B. durch den Klick auf "Desktop anzeigen" des Toolstripemenüs der Taskleiste den Desktop aufrufe,
    wird das Widget nicht mehr angezeigt.
    Ich habe eine Funktion eingebaut welche die Form der Anwendung in den Hintergrund setzt.
    Nun zu meiner Frage, gibt es eine Möglichkeit abzufragen, ob die Form auf dem Desktop überhaupt angezeigt wird?
    Vielen Dank schon mal für eure Hilfe :) .

    Mit freundlichen Grüßen,
    Dominik
    Willkommen im Forum. :thumbup:

    DominikZettl schrieb:

    wird das Widget nicht mehr angezeigt.
    Was soll denn passieren, wenn Du

    DominikZettl schrieb:

    "Desktop anzeigen"
    aufrufst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die schnelle Antwort.
    Zu deiner Frage,
    wenn ich auf Desktop anzeigen (Taskleiste rechtsklick oder rechts neben der Uhrzeit) klicke, soll dass Programm
    auf dem Desktop bleiben und nicht "verschwinden".
    Meine Idee dazu wäre eine Abfrage einzubauen, hier mal eine Überlegung:
    Wenn Form nicht angezeigt wird -> Form mit dem "BringToFront" Befehl nach vorne holen -> Form mit meiner Funktion in den Hintergrund bringen.
    Problem bei dieser Überlegung ist, dass ich den ersten Teil "Wenn Form nicht angezeigt wird" nicht umsetzen kann, mir fehlt wahrscheinlich dass Wissen/Können dazu :/.
    Ich hoffe Ich hab es verständlich dargestellt :)

    DominikZettl schrieb:

    auf dem Desktop bleiben und nicht "verschwinden".
    Du müstest das Event SizeChanged abfangen und entsprechend reagieren.
    ----
    Habs getestet, wenn Du Me.WindowState = FormWindowState.Normal in diesem Event aufrufst, funktioniert das nur, wenn Du per Klick auf die ControlBox die Form minimierst.
    Der Button "Desktop anzeigen" funktioniert etwas anders, deswegen der Timer:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_SizeChanged(sender As Object, e As EventArgs) Handles MyBase.SizeChanged
    3. If Me.WindowState = FormWindowState.Minimized Then
    4. 'Me.WindowState = FormWindowState.Normal
    5. Timer1.Start()
    6. End If
    7. End Sub
    8. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    9. Timer1.Stop()
    10. Me.WindowState = FormWindowState.Normal
    11. End Sub
    12. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hab das SizeChanged Ereignis eingebaucht, jedoch wird es bei mir nicht aufgerufen wenn ich auf "Desktop anzeigen" klicke. (Wird das Event nicht durch die Änderungen der Größe ausgelöst? Was bei mir nicht gehen würde,
    da ich sowohl eine Minimum- als auch eine MaximumSize angegeben habe.)
    Folglich startet der Timer auch nicht.

    DominikZettl schrieb:

    Folglich startet der Timer auch nicht.
    Mach mal eine neue Form und teste meinen Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn ich ein neues Projekt erstelle funktioniert der Code, aber leider bei meiner Hauptform nicht :/.
    Ich habe folgenden Code, der etwas mit der Form zu tun hat:

    VB.NET-Quellcode

    1. 'Deklarationen
    2. Declare Function SetWindowPos Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hWndInsertAfter As Int32, ByVal x As Int32, ByVal y As Int32, ByVal cx As Int32, ByVal cy As Int32, ByVal wFlags As Int32) As Int32
    3. Const SWP_NOSIZE As Int32 = &H1
    4. Const SWP_NOMOVE As Int32 = &H2
    5. Const SWP_NOZORDER As Int32 = &H4
    6. Const SWP_NOACTIVATE As Int32 = &H10
    7. Const SWP_DRAWFRAME As Int32 = &H20
    8. Const SWP_SHOWWINDOW As Int32 = &H40
    9. Const SWP_HIDEWINDOW As Int32 = &H80
    10. Const HWND_TOPMOST As Int32 = -1
    11. Const HWND_NOTOPMOST As Int32 = -2
    12. Const HWND_BOTTOM As Int32 = 1
    13. 'Form in den Hintergrund setzen
    14. Private Sub tFocusÜberprüfen_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tFocusÜberprüfen.Tick
    15. SetWindowPos(Me.Handle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
    16. End Sub
    17. 'Form abrunden
    18. Sub Round(ByVal ObjForm As Object, ByVal iX As Integer, ByVal iY As Integer, ByVal iWidth As Integer, ByVal iHeight As Integer, ByVal iRadius As Integer)
    19. Dim gp As System.Drawing.Drawing2D.GraphicsPath = New System.Drawing.Drawing2D.GraphicsPath
    20. gp.AddLine(iX + iRadius, iY, iX + iWidth - iRadius, iY)
    21. gp.AddArc(iX + Width - iRadius, iY, iRadius, iRadius, 270, 90)
    22. gp.AddLine(iX + Width, iY + iRadius, iX + iWidth, iY + Height - iRadius)
    23. gp.AddArc(iX + Width - iRadius, iY + Height - iRadius, iRadius, iRadius, 0, 90)
    24. gp.AddLine(iX + Width - iRadius, iY + iHeight, iY + iRadius, iY + iHeight)
    25. gp.AddArc(iX, iY + iHeight - iRadius, iRadius, iRadius, 90, 90)
    26. gp.AddLine(iX, iY + iHeight - iRadius, iX, iY + iRadius)
    27. gp.AddArc(iX, iY, iRadius, iRadius, 180, 90)
    28. gp.CloseFigure()
    29. ObjForm.region = New System.Drawing.Region(gp)
    30. gp.Dispose()
    31. End Sub


    Beim Start wird der Timer "Fokus überprüfen" und die Funktion "Round" aufgerufen, zudem habe ich "ShowInTaskbar" auf False gesetzt und der Formborderstyle ist Sizable.
    Könnte es sein, dass irgendeine Funktion verhindert dass das SizeChanged Ereignis aufgerufen wird?

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

    DominikZettl schrieb:

    aufgerufen wird
    Wann wird Round() mit welchen Parametern aufgerufen?
    Gib Deinem Programm Option Strict On und übergib den 1. Parameter als Control.
    Dies hier funktioniert:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponent()
    3. Round(Me, 0, 0, Me.Width, Me.Height, 100)
    4. End Sub
    5. Private Sub Form1_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize
    6. Round(Me, 0, 0, Me.Width, Me.Height, 100)
    7. End Sub
    8. Sub Round(ByVal ObjForm As Control, ByVal iX As Integer, ByVal iY As Integer, ByVal iWidth As Integer, ByVal iHeight As Integer, ByVal iRadius As Integer)
    9. Dim gp As System.Drawing.Drawing2D.GraphicsPath = New System.Drawing.Drawing2D.GraphicsPath
    10. gp.AddLine(iX + iRadius, iY, iX + iWidth - iRadius, iY)
    11. gp.AddArc(iX + Width - iRadius, iY, iRadius, iRadius, 270, 90)
    12. gp.AddLine(iX + Width, iY + iRadius, iX + iWidth, iY + Height - iRadius)
    13. gp.AddArc(iX + Width - iRadius, iY + Height - iRadius, iRadius, iRadius, 0, 90)
    14. gp.AddLine(iX + Width - iRadius, iY + iHeight, iY + iRadius, iY + iHeight)
    15. gp.AddArc(iX, iY + iHeight - iRadius, iRadius, iRadius, 90, 90)
    16. gp.AddLine(iX, iY + iHeight - iRadius, iX, iY + iRadius)
    17. gp.AddArc(iX, iY, iRadius, iRadius, 180, 90)
    18. gp.CloseFigure()
    19. ObjForm.Region = New System.Drawing.Region(gp)
    20. gp.Dispose()
    21. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Erfahrungen, weniger Programmabstürze, keine unerklärlichen Fehlermeldungen. Option Strict On überprüft einfach, dass du Datentypen korrekt verwendest. Beispiel:
    Falsch:

    VB.NET-Quellcode

    1. ​Dim i as Integer = 5
    2. Dim s As String = i

    Richtig:

    VB.NET-Quellcode

    1. ​Dim i As Integer = 5
    2. Dim s As String = i.ToString


    Falsch:

    VB.NET-Quellcode

    1. ​Dim s as String = "5"
    2. Dim i As Integer = s

    Richtig:

    VB.NET-Quellcode

    1. ​Dim s as String = "5"
    2. Dim i as Integer = Integer.Parse(s)
    3. //oder
    4. If Integer.TryParse(s, i) Then
    5. Messagebox.Show(i)
    6. else
    7. Messagebox.Show("Error")
    8. End If


    Mag für einfache Datentypen wie String, Integer und Double als unwichtig erscheinen, aber wenn du versuchst ein Object als Control zu behandeln, fliegen dir die Exceptions um die Ohren.

    LG
    Ok vielen Dank, habe das Problem jetzt gelöst :D
    Hab jetzt jedoch ein neues Problem:
    Wenn ich nach meiner Updatefuntkion dass Programm extern von meiner anderen Anwendung starten lasse (z.B. Über "Process Start oder Shell ...."), funktioniert es wieder nicht mit dem "Desktop anzeigen".
    Wenn ich das Programm selber, quasi als normaler Benutzer starte, funktioniert dies einwandfrei und die Form bleibt immer auf dem Desktop.
    Hat jemand eine Ahnung an was es liegen könnte?