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:
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źć!
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.
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.
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ć.
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;
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...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