Как запустить приложение WinForm сведено к минимуму?
Я успешно создал приложение, которое сворачивает в трей с помощью NotifyIcon. Когда форма закрыта вручную, она успешно скрыта с рабочего стола, панели задач и alt-tab. Проблема возникает при попытке запуска с свернутым приложением. Сначала проблема заключалась в том, что приложение будет свернуто, но все равно будет отображаться в диалоге alt-tab. Изменение FormBorderStyle на один из параметров ToolWindow (из параметра "Нет") исправило это, но создало другую проблему. Когда приложение запускается впервые, заголовок свернутого окна виден прямо над меню "Пуск":
![enter image description here]()
Открытие формы и ее закрытие приводит к ее правильному скрытию. Я перепробовал множество вариантов, но здесь по сути, как это работает прямо сейчас...
WindowState установлен в свернутом виде в конструкторе. После некоторой инициализации в конструкторе у меня есть следующие строки:
this.Visible = false;
this.ShowInTaskbar = false;
При двойном щелчке по NotifyIcon у меня появляется следующее:
this.WindowState = FormWindowState.Normal;
this.Visible = true;
this.ShowInTaskbar = true;
Как я уже сказал, я пробовал множество мелких изменений (this.Hide() и т.д.). Есть ли способ сделать NotifyIcon основным компонентом, чтобы я мог полностью запускать и утилизировать форму, оставляя NotifyIcon работающим? Должен быть способ запустить приложение с свернутой формой без каких-либо странностей. Пожалуйста, помогите мне найти это!
Ответы
Ответ 1
Правильный способ сделать это - не допустить, чтобы форма стала видимой в первую очередь. Для этого требуется переопределить 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 Show command used
private bool allowClose; // ContextMenu 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, она не срабатывает, пока не отобразится основная форма. Поэтому не забудьте инициализировать конструктор формы, а не обработчик события загрузки.
Ответ 2
В конструкторе удалите эти две строки:
this.Visible = false;
this.ShowInTaskbar = false;
и добавить после InitializeComponent();
:
this.WindowState = FormWindowState.Minimized;
В дизайнере установите ShowInTaskbar
в false
и FormWindowState
в Normal
.
EDIT:
Если вы отправляете то же самое в событии Load, окно становится сведенным к минимуму, но все же показывается сведенным к минимуму на рабочем столе. Я думаю, что это ошибка.
Ответ 3
Я читаю все ответы и вижу хаки и черную магию... (без обид, товарищи)
Ребята, не нужны хаки. Вам даже не нужно устанавливать "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 будут перестаньте работать.
Ответ 4
При минимизации приложения и вы хотите скрыть его от 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;
Ответ 5
Это "быстрое и грязное исправление" сработало для меня:
$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()
Надеюсь, это поможет кому-то еще...
Ответ 6
Переместите следующий код из конструктора Form
в Form_Main_Load()
. С такой же настройкой на Notification_Icon when Form_Resize()
.
// Hide the Form to System Tray
this.WindowState = FormWindowState.Minimized;