Вопрос

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

enter image description here

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

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

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

Когда дважды щелкается значок уведомления, у меня появляется следующее:

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

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

Это было полезно?

Решение

Правильный способ сделать это - в первую очередь предотвратить видимость формы.Для этого требуется переопределить 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();
    }
}

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

Другие советы

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

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

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

this.WindowState = FormWindowState.Minimized;

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

Редактировать: Если вы опубликуете то же самое в событии загрузки, окно действительно будет свернуто, но по-прежнему будет отображаться свернутым на рабочем столе.Я думаю, что это ошибка.

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

Ребята, никаких взломов не требуется.Вам даже не нужно устанавливать "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 отправлять некоторые сообщения в ваше окно...И ваши крючки / горячие клавиши / etc перестанут работать.

Когда вы сворачиваете приложение и хотите скрыть его с помощью 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;

Это "быстрое и грязное решение" сработало для меня:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top