Beim Minimieren in den Tray wird das Programm auf dem Desktop mit Teil der Titelleiste dargestellt

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von areiland.

    Beim Minimieren in den Tray wird das Programm auf dem Desktop mit Teil der Titelleiste dargestellt

    Ich habe ein kleines Tool erstellt, bei dem per Kommandozeilenargumenten festgelegt werden kann, dass es minimiert starten und sich nur im Tray zeigen soll. Das klappt auch hervorragend. Nun kommt es auf einigen wenigen Rechnern vor, dass beim Minimieren in den Tray links unten auf dem Desktop die verkürzte Titelzeile des Forms mit nur dem Icon, einem "Schliessen" Kreuz und dem einblendbaren Systemmenü erscheint. Und darauf kann ich mir einfach keinen Reim machen.

    So sieht der Abschnitt "Form_Onload" aus, der dafür sorgt, dass die Parameter für den Start des Programmes ausgewertet und angewendet werden:

    VB.NET-Quellcode

    1. Private Sub Form1_Onload(sender As System.Object, e As EventArgs) Handles MyBase.Load
    2. For Each CoArg As String In My.Application.CommandLineArgs
    3. Select Case CoArg
    4. Case "-min", "/min"
    5. WindowState = FormWindowState.Minimized
    6. End Select
    7. Select Case CoArg
    8. Case "-?", "/?"
    9. MessageBox.Show(MsgTxt, "Winset10 Hilfe zu den Befehlszeilenargumenten!", MessageBoxButtons.OK, MessageBoxIcon.Information)
    10. End Select
    11. Next
    12. End Sub


    Und so sieht der Abschnitt "Form_SizeChanged" aus, in dem ich mit Hilfe der Kommandozeilenargumente das minimieren in den Tray regle:

    VB.NET-Quellcode

    1. Private Sub Form1_SizeChanged(sender As System.Object, e As EventArgs) Handles MyBase.SizeChanged
    2. For Each CoZArg As String In My.Application.CommandLineArgs
    3. Select Case CoZArg
    4. Case "-hide", "/hide"
    5. Select Case WindowState
    6. Case FormWindowState.Minimized
    7. ShowInTaskbar = False
    8. NotifyIcon1.Visible = True
    9. Case Else
    10. WindowState = FormWindowState.Normal
    11. ShowInTaskbar = False
    12. NotifyIcon1.Visible = True
    13. End Select
    14. Case "-vis", "/vis"
    15. Select Case WindowState
    16. Case FormWindowState.Minimized
    17. ShowInTaskbar = False
    18. NotifyIcon1.Visible = True
    19. Case Else
    20. WindowState = FormWindowState.Normal
    21. ShowInTaskbar = True
    22. NotifyIcon1.Visible = True
    23. End Select
    24. End Select
    25. Next
    26. End Sub

    Wie gesagt, dass sich das Tool so verhält, kommt bisher nur auf zwei Rechnern vor. Der eine hat als OS Windows 10 Pro x64, der andere ein Windows 10 Home x86 als OS. Hat da jemand von euch vielleicht eine Idee, was ich da vergessen oder übersehen haben könnte?
    Gruss Alex

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

    Frag doch erstmal nach den vermeintlichen AppToTray-Befehlen ab (z.B. am Ende von Form1_SizeChanged), welchen Zustand das Fenster hat: If Me.WindowState <> FormWindowState.Minimized Then Stop. Falls das nämlich trotz "-hide"-Parameter anschlägt, weißt Du, dass da das Kaninchen im Salz liegt und Du das Ganze eher in den Form_Shown-EventHandler packen solltest. Ggf. machst Du es auch mal umgedreht: Von Anfang an den Fensterstatus auf minimiert stellen und nur auf Normal stellen, wenn der "-vis"-Parameter kommt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @areiland Welches System läuft auf den Rechnern, wo es klemmt?
    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!
    @RodFromGermany:

    areiland schrieb:

    Der eine hat als OS Windows 10 Pro x64, der andere ein Windows 10 Home 32 x86 als OS.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @RodFromGermany
    Das ist es ja, auf dem einen ein Windows 10 Pro x64, auf dem anderen ein Windows 10 Home x86. Bei den anderen Rechnern passt alles genau so, wie ich das vorgesehen habe. Das Tool ist mit AnyCpu kompiliert worden.

    @VaporiZed
    Das umstellen auf den Form_Shown Event Handler hat es auch nicht gelöst.
    Gruss Alex

    areiland schrieb:

    so, wie ich das vorgesehen habe.
    Kannst Du das mal ausführen, um Deinen Code dagegen zu testen?
    Vielleicht postest Du mal den kompletten relevanten Code, also die Befüllung des Contextmenüs vom Trayicon usw.
    Ich vermisse in der Form_Load ein ShowInTaskbar = False.
    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!
    @RodFromGermany

    "ShowInTaskbar = False" ändert an diesem Verhalten auch nichts, das hatte ich schon ganz am Anfang überprüft, als ich diese Fehlerstellung feststellte. Im ContextMenüStrip ist nichts, was da reinwirken könnte.

    Einzig die Mausevents beim Trayicon könnte ich mir noch als Auslöser vorstellen, da ich beim Linksklick dort mit einer If Then Prüfung ermittle, ob das Form minimiert oder normal dargestellt ist und diesen Zustand dann invertiere. Links- und Rechtsklick werden dabei mit Select Case ausgewertet, beim Linksklick wird innerhalb von Case mit If Then Else der Fensterzustand ermittelt und dieser invertiert. Möglicherweise liegt ja darin der Knackpunkt. Der zweite Case in diesem Sub öffnet beim Rechtsklick lediglich den Contextmenüstrip.

    Entferne ich die Auswertung der Argumente, dann kann ich das Form auf allen Rechnern problemlos nur mit dem Trayicon, mit "Ausblenden wenn minimiert" etc. betreiben - ohne dass das minimierte Fenster auf dem Desktop erscheint.

    Genaueres mit dem entsprechenden Codeabschnitt dann später!

    Ergänzung:

    Hier der Codeabschnitt mit dem Eventhandler der Mausevents für NotifyIcon1:

    VB.NET-Quellcode

    1. Private Sub NotifyIcon1_Click(sender As Object, e As MouseEventArgs) Handles NotifyIcon1.MouseClick
    2. Select Case e.Button
    3. Case MouseButtons.Left
    4. If WindowState = FormWindowState.Minimized Then
    5. WindowState = FormWindowState.Normal
    6. Else
    7. WindowState = FormWindowState.Minimized
    8. End If
    9. Case MouseButtons.Right
    10. ContextMenuStrip1.Show()
    11. End Select
    12. End Sub

    Ich denke nicht, dass die Verwendung von If Then Else innerhalb des Case Blockes den Unterschied ausmachen könnte.
    Gruss Alex

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