Как запустить приложение WinForm свернутым в трей? - PullRequest
45 голосов
/ 13 ноября 2009

Я успешно создал приложение, которое сворачивает в трей с помощью NotifyIcon. Когда форма закрыта вручную, она успешно скрыта с рабочего стола, панели задач и alt-tab. Проблема возникает при попытке запуска с свернутым приложением. Сначала проблема заключалась в том, что приложение будет свернуто, но все равно будет отображаться в диалоге alt-tab. Изменение FormBorderStyle на один из параметров ToolWindow (из параметра «Нет») исправило это, но создало другую проблему. Когда приложение запускается впервые, заголовок свернутого окна виден прямо над меню «Пуск»:

enter image description here

Открытие формы и ее закрытие приводит к ее правильному скрытию. Я перепробовал множество вариантов, но вот как это работает сейчас ...

WindowState имеет значение Minimized в Designer. После некоторой инициализации в конструкторе у меня появляются следующие строки:

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

При двойном щелчке по NotifyIcon у меня появляется следующее:

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

Как я уже сказал, я пробовал множество мелких вариаций (this.Hide () и т. Д.). Есть ли способ сделать NotifyIcon основным компонентом, чтобы я мог полностью запускать и утилизировать форму, оставляя NotifyIcon работающим? Должен быть способ запустить приложение с свернутой формой без каких-либо странностей. Пожалуйста, помогите мне найти его!

Ответы [ 5 ]

76 голосов
/ 14 ноября 2009

Правильный способ сделать это - предотвратить появление формы во-первых. Это требует переопределения SetVisibleCore (). Давайте предположим, что контекстное меню для NotifyIcon с командой Show и Exit. Вы можете реализовать это так:

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();
    }
}

Обратите внимание на складку с событием Load, она не сработает, пока не отобразится основная форма Поэтому обязательно выполняйте инициализацию в конструкторе формы, а не в обработчике события Load.

17 голосов
/ 13 ноября 2009

В конструкторе удалите эти две строки:

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

и добавить после InitializeComponent();:

this.WindowState = FormWindowState.Minimized;

В конструкторе установите ShowInTaskbar на false и FormWindowState на Normal.

EDIT: Если вы опубликуете то же самое в событии Load, окно будет свернуто, но все равно будет свернуто на рабочем столе. Я думаю, что это ошибка.

16 голосов
/ 13 декабря 2011

Я читаю все ответы и вижу хаки и черную магию ... (без обид, приятели)

Ребята, хаки не нужны. Вам даже не нужно устанавливать «ShowInTaskbar = false» и другие вещи. Просто сделай это:

    //"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();
    }

ПРИМЕЧАНИЕ: Настоятельно рекомендую НЕ ПРИКАСАТЬСЯ к свойству ShowInTaskbar. Например, если ваше приложение регистрирует общесистемные горячие клавиши или другие подобные вещи (хуки и т. Д.) - установка ShowInTaskBar = false и сворачивание вашего приложения не позволит Windows отправлять некоторые сообщения в ваше окно ... А ваши хуки / горячие клавиши / и т. Д. Будут перестань работать.

2 голосов
/ 26 января 2011

При сворачивании приложения и необходимости скрыть его от Alt + Tab:

Вам также нужно установить непрозрачность, чтобы остановить отображение заголовка рядом с меню «Пуск», когда вы устанавливаете стиль рамки в окне инструмента.

При сворачивании события:

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

При нормализации события:

this.Visible = true;
this.Opacity = 100;
this.FormBorderStyle = FormBorderStyle.FixedSingle; //or whatever it was previously set to
this.ShowInTaskbar = true;
0 голосов
/ 31 августа 2016

Это «быстрое и грязное исправление» сработало у меня:

$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()

Надеюсь, это поможет кому-то еще ...

...