Jak uruchomić aplikację WinForm zminimalizowaną do tray?

Udało mi się stworzyć aplikację, która minimalizuje się do zasobnika za pomocą NotifyIcon. Po ręcznym zamknięciu formularza jest on z powodzeniem ukrywany na pulpicie, pasku zadań i alt-tab. Problem występuje podczas próby uruchomienia aplikacji zminimalizowanej. Początkowo problem polegał na tym, że aplikacja byłaby zminimalizowana, ale nadal pojawiałaby się w oknie dialogowym alt-tab. Zmiana FormBorderStyle na jedną z opcji ToolWindow (z opcji" Brak") naprawiła to, ale wprowadziła inny problem. Gdy aplikacja najpierw uruchamia się pasek tytułowy zminimalizowanego okna widoczny jest tuż nad menu start:

Tutaj wpisz opis obrazka

Otwarcie formularza i jego zamknięcie powoduje jego prawidłowe ukrycie. Próbowałem wielu wariantów, ale oto, jak to teraz działa...

WindowState jest ustawione na minimalizowane w Projektancie. Po pewnym inicjalizacji w konstruktorze mam następujące linie:

this.Visible = false;
this.ShowInTaskbar = false;

Gdy powiadomienie jest dwukrotnie klikane mam "po": {]}

 this.WindowState = FormWindowState.Normal;
 this.Visible = true;
 this.ShowInTaskbar = true;

Jak już mówiłem, próbowałem wielu drobnych wariacji na ten temat (to.Hide (), itp.). Czy istnieje sposób, aby NotifyIcon był głównym składnikiem, tak że mogę całkowicie uruchomić i usunąć formularz, pozostawiając NotifyIcon uruchomiony? Musi być sposób na uruchomienie aplikacji z minimalizowanym formularzem bez żadnych dziwnych rzeczy. Proszę, pomóż mi go znaleźć!

Author: snoob dogg, 2009-11-13

5 answers

Dobrym sposobem na to jest uniemożliwienie widoczności formularza. Wymaga to nadpisania metody SetVisibleCore (). Załóżmy menu kontekstowe dla NotifyIcon z poleceniem Show i Exit. Możesz to zaimplementować w następujący sposób:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        notifyIcon1.ContextMenuStrip = contextMenuStrip1;
        this.showToolStripMenuItem.Click += showToolStripMenuItem_Click;
        this.exitToolStripMenuItem.Click += exitToolStripMenuItem_Click;
    }

    private bool allowVisible;     // ContextMenu's Show command used
    private bool allowClose;       // ContextMenu's Exit command used

    protected override void SetVisibleCore(bool value) {
        if (!allowVisible) {
            value = false;
            if (!this.IsHandleCreated) CreateHandle();
        }
        base.SetVisibleCore(value);
    }

    protected override void OnFormClosing(FormClosingEventArgs e) {
        if (!allowClose) {
            this.Hide();
            e.Cancel = true;
        }
        base.OnFormClosing(e);
    }

    private void showToolStripMenuItem_Click(object sender, EventArgs e) {
        allowVisible = true;
        Show();
    }

    private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
        allowClose = true;
        Application.Exit();
    }
}

Zwróć uwagę na zmarszczkę ze zdarzeniem Load, nie odpali się, dopóki główny formularz nie zostanie po raz pierwszy pokazany. Dlatego należy wykonać inicjalizację w konstruktorze formularza, a nie w obsłudze zdarzenia Load.

 72
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-09 18:40:09

W konstruktorze usuń te dwie linie:

this.Visible = false;
this.ShowInTaskbar = false;

I dodać po InitializeComponent();:

this.WindowState = FormWindowState.Minimized;

W designerze ustaw ShowInTaskbar na false & FormWindowState do Normal.

EDIT: Jeśli opublikujesz to samo w zdarzeniu Load, okno zostanie zminimalizowane, ale nadal będzie wyświetlane zminimalizowane na pulpicie. Myślę, że to błąd.

 17
Author: Yogesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-13 18:15:11

Czytam wszystkie odpowiedzi i widzę hacki i czarną magię... (bez obrazy, koledzy)

Chłopaki, nie potrzeba żadnych hacków. Nie musisz nawet ustawiać "ShowInTaskbar = false" i innych rzeczy. Po prostu zrób to:
    //"Form Shown" event handler
    private void Form_Shown(object sender, EventArgs e)
    {
        //to minimize window
        this.WindowState = FormWindowState.Minimized;

        //to hide from taskbar
        this.Hide();
    }

Uwaga: zdecydowanie zalecam nie dotykać właściwości "ShowInTaskbar". Na przykład, jeśli aplikacja rejestruje systemowe skróty klawiszowe lub inne podobne rzeczy ( Hooki, itp.) - ustawienie ShowInTaskBar=false i zminimalizowanie aplikacji uniemożliwi Windows wysyłanie niektórych Wiadomości do twojego okna... A twoje Hooki/hotkeys / etc przestaną działać.

 14
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-13 08:58:10

Podczas minimalizacji aplikacji i chcesz ją ukryć z Alt + Tab:

Musisz również ustawić krycie, aby zatrzymać wyświetlanie paska tytułowego w pobliżu Menu Start, gdy ustawisz styl obramowania na Okno Narzędzia.

W Dniu Zdarzenia:

this.Visible = false;
this.Opacity = 0;
this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
this.ShowInTaskbar = false;

W Przypadku Normalizacji:

this.Visible = true;
this.Opacity = 100;
this.FormBorderStyle = FormBorderStyle.FixedSingle; //or whatever it was previously set to
this.ShowInTaskbar = true;
 2
Author: Justin Clarke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-26 12:01:20

Ten "szybki i brudny fix" zadziałał dla mnie:

$form1.FormBorderStyle = "fixedtoolwindow"
$form1.top = -1000000
$form1.Left = -1000000
$form1.Width = 10
$form1.Height = 10
$form1.WindowState = "normal"
$form1.ShowInTaskbar = $False
$form1.Opacity = 0
$form1.Hide()
Mam nadzieję, że to pomoże komuś innemu...
 0
Author: David R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-31 13:46:36