Programm minimiert starten



  • Hallo,

    ich hab ein Programm geschrieben, was durch verschiedene globale Shortcuts unterschiedliche Aktionen auslöst.

    Wenn ich mein Fenster minimiere, soll das Programm in den Tray Modus wechseln. Das hab ich mit folgender Funktion realisiert, da sonst die Shortcuts nicht mehr reagierten (wenn ich einfach das Visible auf false gesetzt hab).

    [DllImport("User32.dll")]
    private static extern void SetWindowPos (int hWnd,
                                             int hWndInsertAfter,
                                             int x,
                                             int y,
                                             int cx,
                                             int cy,
                                             int wFlags);
    
    private void TaskBarVisible(int FormHandle, bool Visible)
    {
        if (Visible == true)
           SetWindowPos (FormHandle, 0, 0, 0, 0, 0, 64);
        else
           SetWindowPos (FormHandle, 0, 0, 0, 0, 0, 128);
    }
    

    Beim klickt auf den Minimieren-Button, wir dann diese Funktion ausgelöst.

    private void Form1_Resize(object sender, System.EventArgs e)
    {    
        if (this.WindowState == FormWindowState.Minimized)
        {
           this.trayIcon.ContextMenuStrip = contextMenu;
           TaskBarVisible((int)this.Handle, false);
           this.trayIcon.Visible = true;
        }    
    }
    

    Das klappt auch alles wunderbar. Jetzt will ich das Programm aber minimiert im Tray Modus starten lassen, also hab ich mir gesagt, löst ich einfach die gleiche Funktion im Konstruktor des Forms aus. (Habs auch in der Form1_Load Methode probiert):

    this.WindowState = FormWindowState.Minimized;
    this.trayIcon.ContextMenuStrip = contextMenu;
    TaskBarVisible((int)this.Handle, false);
    this.trayIcon.Visible = true;
    

    Was passiert? Das Fenster startet minimiert und das Trayicon ist zu sehen. Allerdings verschwindet es nicht aus der Taskleiste. Wenn ich es dann aus dieser wiederherstelle und von Hand auf Minimieren klicke, funktioniert es wie gehabt richtig.

    Kann mir jemand einen Tipp geben, wo das Problem liegt?

    Besten Dank.



  • Ich push das Topic mal. Obwohl keine Antwort wahrscheinlich bedeutet, dass es keine sehr einfache Lösung gibt. 😉


  • Administrator

    Darf ich fragen, wieso du nicht einfach diese Eigenschaft benutzt?
    http://msdn.microsoft.com/en-us/library/system.windows.forms.form.showintaskbar.aspx

    Grüssli



  • Hallo,

    ich hab ein Programm, was globale Hotkeys definiert. Wenn ich ShowInTaskbar auf false setze, funktioniert das zwar, dass das Fenster verschwindet, aber die Hotkeys sind dann nicht mehr aktiv. Das ist der Grund, warum ich es wie oben beschrieben mache. Damit funktionierts komischer Weise.

    MFG


  • Administrator

    Ich bin noch Anfänger in C#, kann daher nur Ideen liefern.
    Zu deinem aktuellen Problem würde ich sagen, dass die Fenstereigenschaften, welche du durch TaskBarVisible in Form1_Load setzt, gleich danach wieder überschrieben werden, da die Form erst dann sichtbar wird.

    Ich würde den Aufruf eher in diesem Ereignis reinsetzen:
    http://msdn.microsoft.com/de-de/library/system.windows.forms.form.shown.aspx

    Das minimiert starten setzt du also in Load rein und das TaskBarVisible in Shown . Wahrscheinlich wird das ein kurzes Flackern geben unten, aber das sollte zu verkraften sein.

    Allerdings frage ich mich, ob das Problem nicht eher in der falschen Verwendung von den globalen Hotkeys ist. Also ob du dort irgendwo einen Fehler machst, wodurch du die Eigenschaft ShowInTaskbar nicht verwenden kannst. Ich würde mich jedenfalls auch noch ein wenig mit dieser Fehlermöglichkeit befassen.

    Grüssli



  • Perfekt!

    Genau das war die Lösung. Ich danke dir vielmals für den Tipp. Warum ist mir das nur nicht eher eingefallen?!

    Abschließend nochmal zusammengefasst:

    private void Form1_Load(object sender, EventArgs e)
    {
        this.WindowState = FormWindowState.Minimized;
    }
    
    private void Form1_Shown(object sender, EventArgs e)
    {
        if (this.WindowState == FormWindowState.Minimized)
        {
           this.trayIcon.ContextMenuStrip = contextMenu;
           TaskBarVisible((int)this.Handle, false);
           this.trayIcon.Visible = true;
        }
    }
    

    Also vielen Dank nochmal.

    MFG,
    Ronny


Log in to reply